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は一部の端末では利用できないため。