0

ユーザーに Web ページの一部として画像を見てもらいたい、画像に直接アクセスすることは避けたい。これにより、リンク先のユーザーに関する手がかりが URL に表示される可能性があります (ある Facebook アプリケーションで見た欠陥です)。

画像へのアクセスを監視したり、画像への直接アクセスを防止したりするにはどうすればよいですか (たとえば、URL の書き換えを通じて...)。

これまでに提案されたソリューション:

  • ヘッダーの使用 (信頼できる?)
  • 画像へのアクセスをより困難にする (例: 画像を div の背景として設定する)。
  • ...
4

4 に答える 4

3

防弾の方法はありません。ただし、ヒューリスティックを使用できます。次のヘッダーを調べます。

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

  2. Accept-- このヘッダーには、image/*ブラウザが HTML タグまたは CSS に埋め込まれていることを検出したために画像が要求された場合などの文字列が含まれます。誰かがブラウザに直接入力して画像をリクエストすると、text/html,application/xhtml+xmletcのような値が表示されます。したがって、コンテンツを要求することをお勧めしtext/htmlます。

Apache では、HTTP ヘッダーをチェック (および照合) して、コンテンツにアクセスできるかどうかを判断できます。他のプラットフォームについてはわかりませんが、画像を提供するための汎用プロキシ スクリプトを作成できます。

編集

イメージの URL に開示したくない情報が含まれている場合は、ハッシュまたは暗号化を使用して難読化できます。したがって、次のようなコンテンツを提供する代わりに:

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

あなたは書くでしょう:

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

対応する画像をブラウザに送信するスクリプトを作成する必要があります。

于 2011-07-30T10:01:43.270 に答える
1

これはうまくいくかもしれないアイデアですが、私はあまり考えていませんし、試したこともありません:

  1. サーバーがページのリクエストを受け取ります。
  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 を画像に再度使用しようとしても機能しません。

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

于 2011-07-30T12:54:16.170 に答える
1

よろしければ、やはり防弾ではありませんが、多くの人をだますのは、画像を背景として使用することです。HTML に、特別な透明な 1 ピクセル x 1 ピクセルの gif (html テーブル レイアウトの頃の blank.gif) で満たされたイメージ タグを配置し、実際のイメージのサイズに合わせてサイズを変更します。次に、その背景画像を実際の画像に設定します。これは、右クリックして画像の 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 にとって十分である場合は、あなたや私にとっては十分であると言えます。

編集:これがすでにコメントとして投稿されていることに対する私の意識の完全な欠如を許してください。投稿前に書き始めました。

于 2011-07-30T11:42:18.063 に答える
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.'; 
}
?>

このスクリプトをテストする場合:

  • docroot のどこかに置いてください
  • 同じフォルダーにpng画像を追加します。この画像に img.png という名前を付けます。
  • 画像にアクセスするには、http://url/of/the/script.php?allowed=1を使用します
  • カウンターにアクセスするには、「許可された」変数を削除します。

それが役立つことを願っています!

于 2011-07-30T11:59:05.197 に答える