web-dev-qa-db-ja.com

画像への直接アクセスから保護するにはどうすればよいですか?

画像の多いウェブサイトを作りたいです。ただし、画像への直接アクセスから保護したいと思います。 Webサイトにアクセスせずに画像への直接リンク。

これを行うための好ましい方法は何ですか?そして、長所と短所の選択肢は何ですか?

私はいくつかのアイデアを持っています(それらが可能かどうかはわかりません):

  • ファイルのアクセス許可
  • PHPセッション
  • 一時ファイル名またはURL
  • HTTPリダイレクト?

多分これは多くのウェブサイトで実践されていませんか?例えば。ログインせずにFacebookのプライベート写真にアクセスしようとしましたが、それでも写真にアクセスできました。

プラットフォームはおそらくNginXとPHPを備えたUbuntuマシンになるでしょう。

18
Jonas

http://us3.php.net/image

Img要素をphpファイルにリンクします。このファイルは、ユーザーが適切な権限を持っているかどうかを確認します。適切な権限がある場合は、img応答を返送できます。

<img src="url/LoadImg.php?id=1337" alt="" />

それでも、許可を得た人は画像をダウンロードして、他の場所(ウェブスペース/メール/その他)に提供することができます。盗むのを少し難しくするために、画像の右クリックを無効にすることができますが、それでもhttpについて少し知っているユーザーはそれを盗むのに問題はないはずです。画像の上に署名(たとえば、Webサイトのロゴ/名前)を配置して、ソースがどこにあるかを他の人が確認できるようにすることができます。これはphpでも実行できます。

面白くなりたい場合は、リンクが他のページからのものである場合に送信される他の画像(ポルノはこれに最適です:P)を設定できます:P

20
Mark Baijens

次の行を使用して、サイトフォルダに単純な.htaccessファイルを追加します

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://www\.your-domain\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www\.your-domain\.com$ [NC]
RewriteRule .*\.(wav|swf|jpg|jpeg|gif|png|bmp|js|css)$ - [F,NC,L]

jsファイルとcssファイルも追加したことに注意してください。それらをこすり取ろうとする人を見つけるのは奇妙だと思いますが、.

8
Marco Demaio

HtaccessとユーザーのIPを使用して、フォルダーを動的に保護できます。

次の行を使用して、.htaccessファイルをimagesフォルダーに追加します。

order deny,allow
deny from all

次に、PHPを使用して、ユーザーが次のようにログインしたときに、ユーザーのIPをhtaccessファイルに挿入します。

<?
$ip = $_SERVER['REMOTE_ADDR'];
if (!filter_var($ip, FILTER_VALIDATE_IP)) exit();
$file = $_SERVER["DOCUMENT_ROOT"].'/YOUR_IMAGE_FOLDER/.htaccess';
$current = file_get_contents($file);
$current .= "allow from ".$_SERVER['REMOTE_ADDR']." #".$_SESSION['id']."\n";
file_put_contents($file, $current);
?>

フォルダーは、ログインしていないIPからブロックされます。

IPが有効かどうかを確認したことに注意してください。 htaccessファイルに独自のコードを挿入する方法をユーザーに与えないことが重要です。

また、htaccessファイルのIPの右側のコメントにユーザーIDを入れていることにも注意してください。ユーザーがログアウトしたら、htaccessファイルを検索して、ユーザーのIPを削除できます。

動的IPを使用しているユーザーがキックオフされないように、リクエストごとにこれを更新できます。

私はこの方法をメンバーエリア全体で使用しています。これは優れたセキュリティの追加レイヤーです。必ず、メンバーフォルダの外にあるスクリプトにログインしてください。

6
Matthew

これは便利かもしれません: 。htaccessで画像のホットリンクを許可/拒否

編集:この方法について注意すべきことの1つは、一部のブラウザー/ AV /ファイアウォールソフトウェアが参照時にリファラーデータを削除することです。これにより、正当なユーザーがホットリンカーとして扱われる可能性があります。

サイトですでに何らかの認証またはセッションシステムを使用している場合は、@ MarkBaijensの回答に記載されている方法を使用することをお勧めします。

更新:ホットリンクを防ぐためのNGiNX書き換えルール:

location ~* (\.jpg|\.png|\.css)$ {
    valid_referers blocked mydomain.com www.mydomain.com;
    if ($invalid_referer) {
        return 444;
    }
}
3
drudge

私は両方の方法を使用します-ユーザーgentとreferrerをチェックします。 .htaccessで確認するユーザーエージェント。そして、phpファイルでリファラーチェック。あなたはそれを見ることができます http://coloring-4kids.com

これが私のコードです:

RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?pinterest\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?pinterest\.com$ [NC]

RewriteCond %{HTTP_USER_AGENT} !(Googlebot|bingbot|msnbot|yahoo-mmcrawler|YandexImages) [NC]
RewriteCond %{HTTP_USER_AGENT} !googlebot-image [NC]
RewriteCond %{HTTP_USER_AGENT} !googlebot [NC]
RewriteCond %{HTTP_USER_AGENT} !googlebot-news [NC]
RewriteCond %{HTTP_USER_AGENT} !googlebot-video [NC]
RewriteCond %{HTTP_USER_AGENT} !googlebot-mobile [NC]
RewriteCond %{HTTP_USER_AGENT} !mediapartners-google [NC]
RewriteCond %{HTTP_USER_AGENT} !mediapartners [NC]
# RewriteCond %{HTTP_USER_AGENT} !adsbot-google [NC]
RewriteCond %{HTTP_USER_AGENT} !bingbot [NC]
RewriteCond %{HTTP_USER_AGENT} !facebookexternalhit [NC]
RewriteCond %{HTTP_USER_AGENT} !baiduspider [NC]
RewriteCond %{HTTP_USER_AGENT} !yandex [NC]
RewriteCond %{HTTP_USER_AGENT} !sogou [NC]
RewriteCond %{HTTP_USER_AGENT} !twitterbot [NC]
RewriteCond %{HTTP_USER_AGENT} !pinterest [NC]


RewriteRule (^.*\.(gif)$) /watermark.php?src=$1 [L]

透かし.php

<?php  

$test = getenv("HTTP_REFERER");
$proverka =  substr($test, 0, 25);

 header('content-type: image/jpeg');

 $image = imagecreatefromgif($_GET['src']);

 $watermark = imagecreatefromgif('watermark.gif');

 $watermark_width = imagesx($watermark);
 $watermark_height = imagesy($watermark);


 $dest_x = imagesx($image) - $watermark_width;
 $dest_y = imagesy($image) - $watermark_height;



if (strpos($proverka, 'media') !== false)
   { $pinproverka=true; }

 if (($proverka != 'http://coloring-4kids.com') && (imagesx($image) > 400) && ($pinproverka!=true) )  { imagecopymerge($image, $watermark, $dest_x - 5, 5, 0, 0, $watermark_width, $watermark_height, 100); }



 imagegif($image);

 imagedestroy($image);
 imagedestroy($watermark);

?>
2
janejoung

PHPスクリプトを使用して、次のようなものを使用して画像を取得できます。

<img src="mysite.com/getimage.php?id=001" />

そして、PHPスクリプトは、HTTP_REFERERのドメインが自分のものであることを確認した後にのみ画像データを返すようにします。

アカウント指向のサイトをお持ちの場合は、おっしゃるようにPHPセッションを使用し、画像データを返す前にPHPスクリプトでセッションを確認することをお勧めします。

2
Evan Mulawski

これは難しいでしょう。クライアントのWebブラウザが画像にアクセスするには、画像が読み取り可能である必要があります。ブラウザへのアクセスを許可する必要があるため、ファイルのアクセス許可は機能しません。誰かがそれらをダウンロードして何かをするのを止めることはできません。

直接リンクのみを停止したい場合、ファイル名を定期的に変更し、これを反映するようにページを更新すると、他のページのリンクが壊れます。

1
Steve Rowe

.htaccessに拒否ルールを追加します

RewriteEngine on 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?domain\.ltd [NC] 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?domain\.ltd.*$ [NC] 
RewriteRule \.(gif|jpg|js|txt)$ /messageforcurious [L]
0
Ketan Borada

上記の回答にはパフォーマンスの問題があります。私の解決策は、ログインシステムは次のとおりです。

画像のディレクトリは、1時間/日ごとなどに名前を変更できます。

images/2h4h4h4h4282hdj/182828.pngからimages/dhd777rhrje82883/182828.png

これは、システムを完成させるため、または特定のユーザーに対して行うことができます。

0
Dum