2011-07-30 19 views
0

ユーザーに画像をWebページの一部として表示させたいしかし、私はそれらの画像に直接アクセスしないようにします。これは、URLに、どのユーザーがリンクしているかの手がかりを与えることができます(Facebookの1つのアプリケーションで見たような欠陥)。画像のアクセスを監視し、直接アクセスを禁止する

画像へのアクセスを監視したり、画像への直接アクセスを妨げたりするにはどうすればよいですか?

ソリューションは、これまで提案さ:ヘッダの

  • 使用(信頼性はありますか?)
  • 画像へのアクセスをより困難に(例:divの背景として設定された画像を)。
  • ...
+2

参照元ヘッダーを確認できます。イメージがあなたのウェブサイトから読み込まれている場合、参照元はあなたのドメイン上のURLでなければなりません。それは絶対確実ではありませんが、一部の広告ブロック/プライバシーソフトウェアとプロキシはリファラーヘッダーを削除し、そうでないときは直接アクセスのように見せます。 –

+1

画像をdivの背景にする - ユーザーが直接リンクを取得することは難しくなりますが、可能です。 –

+0

リファラーをチェックする方法が間違っています。参照元は空でも、間違ってもかまいません(前のページのURL、現在ではない)。 –

答えて

3

防弾方法はありません。ただし、ヒューリスティックを使用することはできます。以下のヘッダを検査:

  1. Referer - このヘッダが存在するであろうと、画像を<img>タグやCSSの結果として、ブラウザによって要求されたです。このヘッダーは、画像が直接要求された場合(アドレスバーにURLを入力して)空になります。このヘッダーに別のドメインが含まれている場合、その他のWebサイトは画像をホットリンクします。 これは予期された動作ですが、すべてのブラウザがこのように動作することは保証されていません。

  2. Accept - このヘッダは、ブラウザがHTMLタグやCSSに埋め込まれたので、画像が要求されたなどimage/*として文字列が含まれています。誰かがブラウザに入力して直接画像をリクエストすると、text/html,application/xhtml+xmlなどの値が見つかるでしょう。これは、ブラウザがリクエスト時に何を期待するか分からないためです。http://website.com/someimage.jpg;したがって、好ましくはtext/htmlのコンテンツを要求します。

Apacheでは、HTTPヘッダーをチェックして(一致させて)コンテンツにアクセスできるかどうかを判断できます。私は他のプラットフォームについてはわかりませんが、画像を提供するための汎用プロキシスクリプトを書くことができます。画像のURLは、あなたが開示されたくない情報が明らかになった場合

編集

、あなたはハッシュまたは暗号化を使用して、それを難読化することができます。だからではなく、コンテンツの提供のような:

<img src="/images/users/12345.jpg"> 

あなたは書きます:

<img src="/images/users/image.php?hash=<?php echo md5('secret' . '12345'); ?>"> 

あなたがブラウザに対応した画像を送信するスクリプトを記述する必要があります。

+0

downvoteの理由は? –

+0

'ブラウザはhttp:// website.com/someimage.jpg'をリクエストしたときに何を期待するのか分からないので - 笑、どのブラウザが愚かなので、URLの' .jpg'を読み込めませんか?そしてあなたの最初の ''ルール ''についての参照元は完全に間違っています。リファラーは空でもよいし、別のドメインを含むこともできる。このヘッダーの動作は非常に予測不可能です。 –

+0

@サルマンA:右クリック&クリックして「画像を表示」すると、リファラーも送信されます – genesis

1

もし私がそうであれば、やはり弾丸ではないものの、多くのトリックは画像​​を背景として使用することです。あなたのHTMLの場所には、特別な透明な1ピクセル×1ピクセルのgif(blank.gifのhtmlテーブルレイアウト)が埋め込まれたイメージタグが置かれ、実際のイメージのサイズにサイズが設定されます。次に、その背景イメージを実際のイメージに設定します。これは、右クリックして画像のURLをダウンロード/取得する方法のみを知っている多くのユーザーを欺くものです。

<html> 
<head> 
    <style> 
     #logo { background: url(my-logo.png); width: 100px; height: 50px; } /* Change this to match your image name and dimensions */ 
    </style> 
</head> 
<body> 
    <img src="blank.gif" id="logo"> 
</body> 
</html> 

私があれば、ユーザプリントスクリーン(どちらもが任意の方法でしょう)、これは助けにはなりません知っているが、それは、それらの少ない知識のあるユーザーのためのソリューションです。さらに、Youtubeのようなサイトは既にこの方法を採用していますので、Googleにとって十分であれば、あなたや私にとっては十分です。

EDIT:私はこのコメントに既に投稿されている意識が不足しています。私はそれが投稿される前に執筆を始めた。

1

ようにすることができます、あなたが匿名アクセスに対してあなたの写真を保護したい場合は、

を(あなたがたとえば、画面キャプチャを作るために、ユーザーを防ぐことはできません)。しかし、これを行うための特効薬は存在しない、と述べましたユーザーがその写真を見ることを許可されているかどうかをチェックし、それをロードするPHPの "プロキシ"を使用してください。

このようなプロキシのサンプルコードは非常に簡単です。 イメージを本当に保護したい場合は、ドキュメントルートの外に保管してください。このスクリプトをテストする場合

<?php 

//Sample image protection proxy. Do not use as is. 

//Let's monitor the authorized accesses 
session_start(); 
$mon = isset($_SESSION['mon']) ? $_SESSION['mon'] : 0; 


//Let's simulate an auth mecanism 
$allowed = isset($_GET['allowed']) ? (int)$_GET['allowed'] : 0; 

if ($allowed === 1) { 
    // DO NOT USE AS IS ! add security checks to prevent XSS, especially if images are uploaded by untrusted users 
    $img = file_get_contents('img.png'); 
    $mon++; 
    $_SESSION['mon'] = $mon; 
    header('content-type:image/png'); 
    echo $img; 
} else { 
     //handle unauthorized access here. 
    //For this example, I send some plain text 
    header('content-type:text/plain'); 
    echo 'You are not allowed to see that picture.'.PHP_EOL; 
    echo 'This picture has been opened : '.$mon. ' times.'; 
} 
?> 

は:

  • が同じフォルダにPNG画像を追加するには、ドキュメントルートのどこかにそれを置きます。この画像の名前をimg.pngとします。
  • 画像にアクセスするには、http://url/of/the/script.php?allowed=1
  • を使用して、 'allowed' varを削除してください。

希望に役立ちます!

1

ここで私は本当にあまりにも多くて、それを考えていませんでしたが、仕事もアイデアだし、それを試していない:

  1. Serverは、ページのリクエストを受信します。
  2. イメージを参照するワンタイム・キー(OTK)を使用して、PHPでページ・コンテンツを生成します。 OTKは、セッション変数またはデータベースに格納できます。
  3. クライアントがページをレンダリングすると、サーバーはOTKを使用して、イメージのクエリパラメータを介して要求を受け取ります。イメージを提供し、OTKを削除します。たとえば、

、代わりに:

<img src="www.mysite.com/mypage/myimage.jpg">

...ワンタイムキーを生成し、それはあなたのイメージを参照するように、ルックアップテーブルにそれを格納します。

4e33fd162fe95 => image.jpg

...その後使用してページを生成する代わりにOTK:

<img src="www.mysite.com/mypage?image=4e33fd162fe95">

サーバーがそのイメージの要求を受信すると、イメージを送信し、OTKを削除します。これは、ページに対するすべての要求が新しいOTKを生成することを意味します。そのURIをイメージ用に再度使用しようとしても機能しません。

これには、クライアント側のキャッシュが機能しなくなり、サーバーにオーバーヘッドが発生するため、パフォーマンス面でいくつかの注意点があります。その他の注意点もあります。

関連する問題