サイト上のリソースのホットリンク(「画像の盗難」/「帯域幅の盗難」)を防ぐ方法


8

「究極の」アンチホットリンク.htaccessを記述しようとしています...

あなたはネット上で多くの例/チュートリアル / ジェネレータを見つけることができますが、それらの多くは間違っているか不完全です(あるいはその両方です)。

これらは私が探している機能です:

  • HTTP_REFERERが外部サイトである場合、ファイル拡張子のリストのホットリンクをブロックする必要があります。
  • .htaccessでハードコーディングせずに、現在のドメイン(duh)のホットリンクを許可する必要があります。
    • 現在のドメインでは、httpおよびhttpsで動作する必要があります。
    • 現在のドメインでは、wwwあり、wwwなしで機能する必要があります。
  • 例外ドメインをこれらのルールに追加できる必要があります(友人のGoogleなど)。これらのドメインは、httpおよびhttpsで、wwwありまたはwwwなしで機能する必要があります。

これは私がこれまでに達成したことです:

<IfModule mod_rewrite.c>

Options +FollowSymlinks
RewriteEngine On

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?mydomain.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?google.com/.*$ [NC]
RewriteRule \.(gif|jpe?g|png|zipx?)$ - [NC,F]

</IfModule>

私の質問:

  1. mydomain.com.htaccessのハードコードを回避する方法は?(この.htaccessをドメインごとに変更せずにすべてのドメインに展開できると便利です。)
  2. 私のRewriteRuleでは、右gif|jpe?g|png|zipx?と同等gif|jpg|jpeg|png|zip|zipxですか?(申し訳ありませんが正規表現ではまだ新しいです。)
  3. 私の知らない私の.htaccessに何か悪いことを見ますか?

#1については、ある程度可能であることがわかっています。私が見つけた最も近いものは、ドメインをハードコーディングせずにURLからwwwを削除するこのスニペットです。この方法を私の質問1に使用する方法はありますか?

RewriteCond %{HTTP_HOST} ^www\.(.+)
RewriteCond %{HTTPS}s/%1 ^(on(s)|offs)/(.+)
RewriteRule ^ http%2://%3%{REQUEST_URI} [L,R=301]

更新:

通常の画像の代わりに透かし入りの画像を提供するソリューションを知っています。しかし、私はこの種の解決策を探していません。すべての種類のバイナリファイル(zip、exe、iso、jpg、png、gif ...)で機能するユニバーサルソリューション(403エラーを提供)が必要です。


IMHO Apacheには、少なくとも含めるオプションとして、この構成ファイルが付属しているはずです。もしあなた/私たちがそれを思いつくことができれば、Apache開発者がそれを追加しても構わないと思うだろうか?
Chris Nava


@Tom O'Connor興味深い読書で、私もそれに同意します。しかし、私の場合、私のスクリプトは、画像などではなく、大きなバイナリファイル(zip、exeなど)に使用されます。だから私はまだ答えを得る必要があります。はい、帯域幅は安価ですが、500 MBのzipは100 KBのjpgと同じではありません...
AlexV

私は答えをダッキングしていませんでした。私はただ愚痴をかいていました;)
トム・オコナー

回答:


9

何をしても、CPUサイクルを「浪費」することになります(参照元サイト(リンクを行うサイト)が承認されているかどうかを判断するために、要求データの処理を行う必要があります)。
あなたができる唯一のことは、最小限のCPUサイクルを浪費しながら帯域幅を節約することです。

Apache Docsには、希望どおりに動作する例いくつかあります。これです:

SetEnvIf Referer example\.com localreferer
<FilesMatch \.(jpg|png|gif)$>
Order deny,allow
Deny from all
Allow from env=localreferer
</FilesMatch>

最も適切なようです(そしてmod_rewriteの完全な重みを必要としません)。
追加のディレクティブを使用してSetEnvIf、有効なリファラーを追加できAllowます。


悪くはありませんが、htaccessでドメイン名をハードコーディングしないソリューションが必要です(質問を注意深く読んでください)。
AlexV

次に、Oliverのようなプログラムによるソリューションが必要です(リスト、正規表現、または許可された参照元の他の表現をハードコードする必要があります-個別のファイルに入れるだけです)
voretaq7

必ずしも私の2番目のコードブロックを見ると、それが実行できることがわかります...私のケースにそれを適応させるだけです...
AlexV

2番目のコードブロックのクリーンアップロジックを使用して(または%{HTTP_HOST}正規表現の解析を減らすために同様の魔法をかけて)、URLのホストをルールセットに挿入できます。これにより、動的ローカルドメインを(広範囲にテストして)購入できますが、それでもハードを実行する必要があります。 -Googleなどの「素敵な」外部参照元(参照元、ユーザーエージェント、IPなどによる)
voretaq7

3

参照元が不明(禁止されている)場合は、Phpファイルを呼び出して画像をparamとして渡し、Phpファイルに大きな赤い文字を入れて、「このファイルはMYWEBSITE.COMからのものです。そして、ここに表示される正式な承認はありません。」

質問については、ルールをグローバルにします。私が間違っている場合は修正してください。ただし、ルールがvhostの前に宣言されている場合は、すべてのvhostに適用されます(「デフォルトルール」のようなもの)。

そして、もう1つのアイデアは単純です。Phpファイル(ここfilter.php)にリダイレクトするだけです。承認されたWebサイトを調べ、問題がなければ、必要なファイルを返します。

RewriteRule /(.*)\.jpg$ /filter.php?im=$2\.jpg [QSA,L]

ではfilter.php、単に負荷を動的バーチャルホストまたはそのような何かのリスト:

if (isset($_SERVER['HTTP_HOST'])) {
   if ((mb_ereg('thereferers\.I\.HATE\.com',HOST) !== false) ) {
       ... your code ...
   }
}

可能性はありますが、(PHPを使用して)これでCPUを「無駄に」したくありません。403だけを配信したい。また、PHPでは、すべてのキャッシュの問題を管理する必要があり、これは非常に複雑になる可能性があります。
AlexV 2011

1

Cloudflareはあなたにいくつかの助けになるかもしれません:http : //www.cloudflare.com

ただし、これは画像に対してのみ機能しますが、それが目的のようです。

ホットリンク保護

画像のホットリンク保護を自動的に有効にして、オフサイトリンクを防止します。ゾーン内になく、空白でないリファラーはアクセスを拒否されます。サポートされているファイル拡張子は、gif、ico、jpg、jpeg、pngです。

保護:http : //mydomain.com/images/pic.jpg バイパスするには:http : //mydomain.com/images/hotlink-ok/pic.jpg


0

質問1:

RewriteEngine On
RewriteCond%{HTTP_REFERER}!^ http://(。+)?yoursite.com/ [NC]
RewriteCond%{HTTP_REFERER}!^ $
RewriteRule。*。(jpe?g | gif | bmp | png)$- [F]

質問2:

はい

質問3

私は私のものを使います


質問1の場合、「yoursite.com」はハードコーディングされているため、役に立ちません。
AlexV

@AlexV:そうではありません。yoursite.comを許可したいアドレスに置き換えるだけで、他のリファラーは画像のダウンロードに失敗します
ジェネシス

そして、それをハードコーディングせずに自分を許可するにはどうすればよいですか?
AlexV

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.