PHP 携帯サイトで画像の保存・コピー・転送を禁止する
携帯サイトで画像の保存・コピー・転送を禁止する(jpegのみ)
画像の保存・コピー・転送を禁止するため、PHPで画像を吐き出すプログラムを書きました。
http://www.plusmb.jp/2008/10/17/784.html
を参考に、というかほぼ同じです。。
下記2点追加しています。
- 画像サイズの変更
- ソフトバンクのheaderにno-store
image.php
<?php $file_path = $_SERVER['DOCUMENT_ROOT'].'../photo/'.$_GET['filename']; // ファイルの存在チェック if ((!file_exists($file_path)) || ($file_path == '')) { echo 'Error : File not exists.'; exit; } // 拡張子の取得 $pathinfo = pathinfo($file_path); if (empty($pathinfo['extension'])) { echo 'Error : Extention not exists in file name.'; exit; } // 画像ファイルのmimetypeを確認 $imageInfo = getimagesize($file_path); $mimeType = image_type_to_mime_type($imageInfo[2]); // 画像リサイズ switch ($pathinfo['extension']) { case "jpeg": case "jpg": if ($mimeType !== 'image/jpeg') { echo 'Error : This file is not jpeg file.'; exit; } $img = imagecreatefromjpeg($file_path); break; default: echo 'Error : This file is not allowed file type.'; exit; break; } //画像の縦・横幅取得 $width = ImageSx($img); $height = ImageSy($img); //拡大縮小率(横幅を100pxにする) $resize_num = 100/$width; $img_out = ImageCreateTrueColor($width*$resize_num, $height*$resize_num); ImageCopyResampled($img_out, $img, 0,0,0,0, $width*$resize_num, $height*$resize_num, $width, $height); // ユーザーエージェント判別 $userAgent = $_SERVER['HTTP_USER_AGENT']; if (preg_match('/^DoCoMo/', $userAgent)) { $agent_carrier = 'i'; } elseif (preg_match('/^(J\-PHONE|Vodafone|SoftBank|MOT\-)/', $userAgent)) { $agent_carrier = 's'; } elseif (preg_match('/^(KDDI\-|UP\.Browser)/', $userAgent)) { $agent_carrier = 'e'; } else { echo 'Error : Out of allowed carrier.'; exit; } // DoCoMo,auの場合は後処理でバッファ取得のためバッファ機能を有効化 if ($agent_carrier == 'i' or $agent_carrier == 'e'){ // バッファ機能を有効化 ob_start(); } // JPEGヘッダ出力 header("Content-Type: image/jpeg"); // ソフトバンクの場合は画像保存防止のヘッダを書き出す if ($agent_carrier == 's'){ // ソフトバンク向け画像保存防止処理 header("x-jphone-copyright: no-store, no-transfer, no-peripheral"); } // 画像出力 imagejpeg($img_out); // DoCoMo,auの場合は画像バイナリに書き込み if ($agent_carrier == 'i' or $agent_carrier == 'e'){ // バッファデータの取得 $buffer = ob_get_clean(); // バイナリのコメント部以外を抽出 $part1 = explode("\xFF\xFE", $buffer, 2); $part2 = explode("\xFF", $part1[1], 2); // コメント部を上書き if ($agent_carrier == 'i') { // 000Bは「copy="NO"」の文字列バイト数(9) + 2 = 13 の16進数 $buffer = $part1[0] . "\xFF\xFE\x00\x0Bcopy=\"NO\"\xFF" . $part2[1]; } elseif ($agent_carrier == 'e') { // 0013は「kddi_copyright=on」の文字列バイト数(17) + 2 = 19 の16進数 $buffer = $part1[0] . "\xFF\xFE\x00\x13kddi_copyright=on\xFF" . $part2[1]; } // バッファ出力 print $buffer; } // メモリ解放 imagedestroy($img_out); ?>
画像表示してみる
下記のようにファイル名を指定して画像を表示します。
http://xxxx/image.php?filename=ファイル名
- docomo
コピー・転送禁止となります。
docomoは保存禁止にできません。
- au
コピー・転送禁止となります。
保存禁止にしたい場合は、
imgタグにcopyright="yes"をつけることで、保存禁止にできます。
<img src="http://xxxx/image.php?filename=ファイル名" copyright="yes"/>
保存禁止 or コピー・転送禁止となります。
※no-storeは一部の端末では利用できないため。