Bagaimana mencegah hot linking ("pencurian gambar" / "pencurian bandwidth") dari sumber daya di situs saya?

8

Saya mencoba untuk menulis tautan "hot" anti hot .htaccess ...

Anda dapat menemukan banyak contoh / tutorial / generator di internet tetapi banyak dari mereka salah atau tidak lengkap (atau bahkan keduanya).

Ini adalah fitur yang saya cari:

  • Harus memblokir tautan panas untuk daftar ekstensi file ketika HTTP_REFERER adalah situs asing.
  • Harus mengizinkan tautan panas untuk domain saat ini (duh) tanpa melakukan harcoding di .htaccess.
    • Untuk domain saat ini, domain harus bekerja di bawah http dan https.
    • Untuk domain saat ini harus berfungsi dengan www dan tanpa www.
  • Harus dapat menambahkan pengecualian domain ke aturan ini (seperti teman kami Google) dan domain ini harus bekerja di bawah http dan https dan dengan www atau tanpa www.

Inilah yang saya capai sejauh ini:

<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>

Pertanyaan saya:

  1. Bagaimana menghindari hardcode mydomain.comdi .htaccess? (Akan sangat bagus untuk dapat menggunakan .htaccess ini ke semua domain saya tanpa harus memodifikasinya untuk masing-masing.)
  2. Dalam RewriteRule saya, gif|jpe?g|png|zipx?apakah ini setara dengan gif|jpg|jpeg|png|zip|zipxbenar? (Maaf masih baru di ekspresi reguler.)
  3. Apakah Anda melihat sesuatu yang buruk di .htaccess saya yang tidak saya sadari?

Untuk # 1 saya tahu itu agak mungkin. Yang paling dekat yang saya temukan adalah potongan ini yang menghapus www dari URL tanpa hardcoding domain. Apakah ada cara untuk menggunakan metode ini untuk pertanyaan saya # 1?

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

Memperbarui:

Saya mengetahui solusi yang akan menyajikan gambar yang ditandai dengan air alih-alih yang biasa. Tapi saya tidak mencari solusi semacam ini. Saya ingin solusi universal (melayani 403 kesalahan) yang akan bekerja untuk semua jenis file biner (zip, exe, iso, jpg, png, gif ...).

AlexV
sumber
IMHO Apache harus datang dengan file konfigurasi ini setidaknya sebagai opsi untuk disertakan. Saya ingin tahu apakah ada pengembang Apache yang mau menambahkannya jika Anda / kami dapat membuatnya?
Chris Nava
5
Jangan. Inilah alasannya - tomoconnor.eu/blogish/mod-rewrite-killing-social-media
Tom O'Connor
@ Tom O'Connor Bacaan yang menarik dan saya setuju dengan itu. Tapi skrip saya dalam kasus saya akan digunakan untuk file biner besar (seperti zip, exe ...) dan bukan gambar dan semacamnya. Jadi saya masih perlu mendapat jawaban. Ya bandwidth itu murah, tetapi zip 500 MB tidak sama dengan jpg 100 KB ...
AlexV
Saya tidak menunduk jawaban. Saya hanya menggerutu;)
Tom O'Connor

Jawaban:

9

Apa pun yang Anda lakukan, Anda akan "membuang-buang" siklus CPU (untuk menentukan apakah situs pengarah (yang melakukan penautan) sah atau tidak, Anda harus melakukan beberapa pemrosesan data permintaan).
Satu-satunya hal yang dapat Anda lakukan adalah menghemat bandwidth sambil membuang siklus CPU minimum .

Ada beberapa contoh di Apache Documents yang melakukan persis seperti yang Anda inginkan. Yang ini:

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

tampaknya menjadi yang paling berlaku (dan tidak memerlukan berat mod_rewrite penuh).
Anda dapat menambahkan rujukan yang valid tambahan dengan arahan tambahan SetEnvIfdan Allow.

voretaq7
sumber
Tidak buruk, tapi saya butuh solusi yang tidak meng-hardcode nama domain di htaccess (baca pertanyaan saya dengan seksama).
AlexV
Maka Anda memerlukan solusi terprogram seperti yang diusulkan Oliver (yang masih mengharuskan Anda untuk membuat hardcode daftar, ekspresi reguler, atau representasi lain dari perujuk yang diizinkan - Ini hanya memungkinkan Anda memasukkannya ke dalam file terpisah)
voretaq7
Belum tentu jika Anda melihat blok kode 2 saya, Anda dapat melihat itu dapat dilakukan ... Saya hanya perlu menyesuaikannya dengan kasus saya ...
AlexV
Anda dapat menggunakan logika pembersihan di blok kode kedua Anda (atau sulap serupa hanya %{HTTP_HOST}dengan parsing kurang regex) untuk menyisipkan host URL ke dalam ruleset Anda, yang seharusnya memberi Anda domain lokal dinamis (uji ekstensif), tetapi Anda masih harus bersusah payah -kode "bagus" perujuk eksternal seperti Google (dengan perujuk, agen pengguna, IP, dll.)
voretaq7
3

Bagaimana dengan menulis aturan bahwa, jika referer tidak diketahui (dilarang), cukup panggil file Php tempat Anda meneruskan gambar sebagai param, dan dalam file Php, cukup masukkan merah besar: "file ini berasal dari MYWEBSITE.COM dan tidak memiliki otorisasi resmi untuk ditampilkan di sini ".

Adapun pertanyaan Anda, buat aturan Anda mendunia. Perbaiki saya jika saya salah, tetapi jika aturannya dideklarasikan sebelum vhost apa pun, itu akan diterapkan pada semua vhost (semacam "aturan default").

Dan ide lain sederhana: cukup arahkan kembali ke file Php (di sini filter.php) yang akan mencari di situs web resmi dan mengembalikan file yang diperlukan jika semuanya baik-baik saja:

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

Dalam filter.phphanya beban dinamis daftar vhost atau sesuatu seperti itu:

if (isset($_SERVER['HTTP_HOST'])) {
   if ((mb_ereg('thereferers\.I\.HATE\.com',HOST) !== false) ) {
       ... your code ...
   }
}
Olivier Pons
sumber
Itu kemungkinan, tapi saya tidak ingin "membuang" CPU untuk ini (dengan menggunakan PHP). Saya hanya ingin melayani 403-an. Juga dengan PHP, Anda harus mengelola semua masalah caching dan ini bisa sangat kompleks.
AlexV
1

Cloudflare mungkin bisa membantu Anda: http://www.cloudflare.com

Namun ini hanya berfungsi untuk gambar tetapi tampaknya itulah yang Anda cari.

Perlindungan Hotlink

Secara otomatis mengaktifkan perlindungan hotlink untuk gambar Anda untuk mencegah penautan di luar situs. Referer yang tidak di zona dan tidak kosong akan ditolak aksesnya. Ekstensi file yang didukung adalah gif, ico, jpg, jpeg, dan png.

Dilindungi: http://mydomain.com/images/pic.jpg Untuk memotong: http://mydomain.com/images/hotlink-ok/pic.jpg

pablo
sumber
0

pertanyaan 1:

RewriteEngine Pada
RewriteCond% {HTTP_REFERER}! ^ Http: // (. +)? Yoursite.com/ [NC]
RewriteCond% {HTTP_REFERER}! ^ $
RewriteRule. *. (Jpe? G | gif | bmp | png) $ - [F]

pertanyaan 2:

Iya

pertanyaan 3

Saya akan menggunakan satu saya

asal
sumber
Untuk pertanyaan 1, "yoursite.com" hardcoded sehingga tidak membantu.
AlexV
@AlexV: Tidak. Gantilah yoursite.com dengan alamat yang ingin Anda izinkan dan rujukan lain akan gagal mengunduh gambar apa pun
genesis
Dan bagaimana saya membiarkan diri tanpa hardcoding?
AlexV
-1

Atau gunakan CoralCDN semut biarkan hotlink rakyat ke konten hati mereka?

Tom Newton
sumber