Translate

2016年2月23日火曜日

【php】【ajax】【.htaccess】いまだに画像をローカルへダウンロードされたくない人がいるときは

色々と考えてみた。

使うもの
javascript php .htaccess
※スクリーンショットは防げません

main.html - メインとなるページ。DBと連動したりするならphpで書く。
clone.php - postで受け取ったアドレスの画像を画像フォルダから複製して、複製画像のURLを返す
delete.php - postで受け取ったアドレスの複製画像を消す
/image/ - 画像フォルダ。実際はもっと分かりづらい名前に。元の画像はここに入れる。
/image/.haccess - 設定ファイル
/tmp/ - 仮画像保存フォルダ
/tmp/.haccess - 設定ファイル

流れ

ページにアクセス。呼び出す画像のファイル名は暗号化されているとする。
1:javascriptで仮ファイル名を作成(Math.ceil(Math.random()*10000000) + ".jpg"など)
2:ajaxで画像名、仮ファイル名をpost
3:clone.phpが/tmp/フォルダに、仮ファイルを作成。
4:returnで仮ファイル名のURLを取得
5:canvasに画像を書き出し
6:ajaxで仮ファイル名をpost
7.delete.phpが/tmp/フォルダの仮ファイルを削除

設定(特徴的な箇所のみ記述)

main.html
http://www.stylish-style.com/csstec/basic/g-photo-guard.html
こちらを参考に、canvasには透明gifをのせておく。

/tmp/.haccess

Header set Cache-Control "no-store"
Header set Pragma "no-store"
(注意)no-cacheではないです。

/image/.haccess
-deny from all

clone.php、delete.php
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') (ajax以外のアクセスでは動かないように)

結果

○右クリック、ドラッグ保存→透過gifでガード
○ソースコードを読む→読み込んだ仮画像は削除済
○キャッシュから拾う→キャッシュ防止済

元画像フォルダへのアクセスは、phpのみ可能にしておきます。
スクリーンショットは防げませんが、かなり防げるような。
javascriptが切られていると、ajaxが発動されないので画像のコピーが行われません。
ajaxでファイルのクローンを作るという動作を行っているので、
悪意のあるユーザーにビシバシpostされまくると危険かも。
ここでは書いていませんが、連続post対策は必須。

0 件のコメント:

コメントを投稿