4

私たちのサイトでは、画像保護セクションを行っています。したがって、画像保護の一環として、画像にアンチホットリンクを提供する必要があります。私たちのサイトでは、生成された URL を使用して画像を表示しています。

たとえば、私たちのサイトでは、画像ソースは次のようになります。image_file.php?type=image&w=10&h=10&i=12

(これは単なる例の目的のための偽の URL です)。

この URL を使用してサイトに画像を表示すると同時に、ホットリンクを防止したいのですが、ホットリンクを防止する方法はありますか?

4

6 に答える 6

8

.htaccess メソッドを利用できる場合は、さらに素晴らしいことに、私のコメントで述べたように、base64 エンコーディングを利用するのが 100% 確実な方法です。画像を表示する場合、次のコードを使用して画像を base64 に変換できます。

<?php
$imagedata = file_get_contents("/path/to/image.png");
$base64 = base64_encode($imagedata);
?>
<img src="data:image/jpeg;base64,<?= $base64; ?>" />

また、本当にクリエイティブになりたい場合は、.htaccess ファイルを使用して別の画像を表示することで、ホットリンクの「泥棒」を「RAT」することができます...次のようにします。

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?mydomain.com/.*$ [NC]
RewriteRule \.(gif|jpg|png)$ http://www.mydomain.com/dontstealmystuff.png [R,L]

dontstealmystuff.png がサーバーで利用可能であることを確認してください

于 2012-08-10T04:59:01.087 に答える
3

基本的な.htaccessの例

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]

上記は(私のような)空白のリファラーを許可します。

これはしません:

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]

あなたが見つけることができるかなりの数のバリエーションがあります、あなたに最適なものを見つけるために少し遊んでみる必要があるかもしれません。

于 2012-08-10T04:47:10.670 に答える
3

通常、画像のホットリンクはリファラーによって検出されますが、次の場合には機能しません。

  • ユーザーは自分のブラウザでのリファラー送信をオフにしました (プライバシーの目的でこれを持っています)
  • ページは HTTPS 経由で表示されます (ブラウザーはリファラー データを送信すべきではありません)。

実際のユーザーが画像を表示できないようにブロックします。

この問題に対処するときは、セッション / Cookie の使用を検討してください。その場合、すべての画像を php スクリプト経由で渡す必要があります。

于 2012-08-10T06:51:37.187 に答える
2

一般的に、これを行う適切な方法は、次のようなコマンドを使用した.htaccessファイルのようなものです。

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?somesite\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*\.(jpe?g|gif|bmp|png)$ http://i.imgur.com/aNbhd.jpg [L]

ただし、PHPでこれを行う場合は、基本的に同じです。$_SERVER['HTTP_REFERER']がページのURLで始まることを確認するだけです。ただし、HTTP_REFERERをスプーフィングすることは可能であるため、100%になることはありません。ただし、ユーザーはこれを行う必要があります(外部サイトはかなり(ほとんど...)これを偽装することはできません)。そのため、他のサイトがiframeやその他のフープラにサイトを配置せずに画像を埋め込むことを防ぎます。

別の方法で、サーバー上で最も困難になるとはいえ、おそらく最も安全な方法は、$ _ SESSION変数を使用してトークン/フラグを渡し、トークンをチェックすることです。

session_start();
$_SESSION["allow_images"] = true;

次に、それらの画像を取得するPHPページで:

if($_SESSION["allow_images"])
{ 
     //Send some pics! 
}

ただし、これは、ユーザーが自分のセッションをまだアクティブにしていないほど最近サイトにアクセスしていない場合にのみ機能します。

于 2012-08-10T04:52:03.897 に答える
0

$_SERVER['HTTP_REFERER']の値を既知の値と照合してみることができますが、ドキュメントに記載されているように、なりすましの可能性があります。ただし、一般的なケースに対しては役立つ場合があります。

于 2012-08-10T04:42:55.890 に答える
0

image_file.phpでは、これにhttp_refererを使用します。

$ref = isset($_SERVER['HTTP_REFERER'])? $_SERVER['HTTP_REFERER']: "";
if ($ref != "" && strpos($ref,'http://www.yourdomain.com/')===0)
{
   //the request for this image is coming from some other domain, so take appropriate action
}
else
{
  //do whatever logic you are currently using to show the images
}

ここで本格的な解決策を見つけてください:http ://safalra.com/programming/php/prevent-hotlinking/

于 2012-08-10T04:45:47.447 に答える