Как предотвратить горячие ссылки («кража изображений» / «кража пропускной способности») ресурсов на моем сайте?

8

Я пытаюсь написать "окончательный" анти горячие ссылки .htaccess ...

Вы можете найти много примеров / учебных пособий / генераторов в сети, но многие из них неправильные или неполные (или даже оба).

Это функции, которые я ищу:

  • Должен блокировать горячие ссылки для списка расширений файлов, когда HTTP_REFERER является сторонним сайтом.
  • Необходимо разрешить горячие ссылки для текущего домена (duh), не кодируя его в .htaccess.
    • Для текущего домена он должен работать под 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 я знаю, что это несколько возможно. Самый близкий я нашел этот фрагмент, который удаляет www из URL без жесткого кодирования домена. Есть ли способ использовать этот метод для моего вопроса № 1?

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

Обновить:

Мне известны решения, которые будут служить изображением с водяным знаком вместо обычного. Но я не ищу такого решения. Я хочу универсальное решение (обслуживать 403 ошибки), которое будет работать для всех видов двоичных файлов (zip, exe, iso, jpg, png, gif ...).

AlexV
источник
ИМХО Apache должен поставляться с этим файлом конфигурации, по крайней мере, в качестве опции для включения. Интересно, захотят ли какие-нибудь разработчики Apache добавить его, если вы / мы могли бы придумать его?
Крис Нава
5
Не. Вот почему - tomoconnor.eu/blogish/mod-rewrite-killing-social-media
Том О'Коннор,
@ Tom O'Connor Интересное чтение, и я согласен с этим. Но мой сценарий в моем случае будет использоваться для больших двоичных файлов (например, zip, exe ...), а не для изображений и тому подобного. Так что мне все равно нужно получить ответ. Да, пропускная способность дешева, но почтовый индекс на 500 МБ - это не то же самое, что jpg на 100 КБ ...
AlexV
Я не уклонялся от ответа. Я просто скулил;)
Том О'Коннор
Рассмотрим code.google.com/p/mod-auth-token, как это прокомментировано на serverfault.com/questions/61588/mod-secdownload-for-apache-2-x
alex

Ответы:

9

Независимо от того, что вы делаете, вы будете «тратить» циклы ЦП (чтобы определить, авторизован ли сайт-реферер (тот, который выполняет связывание) или нет, вы должны выполнить некоторую обработку данных запроса).
Единственное, что вы можете сделать, это сохранить пропускную способность, тратя при этом минимум циклов ЦП.

В 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директивами.

voretaq7
источник
Неплохо, но мне нужно решение, которое не будет жестко задавать доменное имя в htaccess (внимательно прочитайте мой вопрос).
AlexV
Затем вам нужно программное решение, подобное предложенному Оливером (которое все еще требует, чтобы вы жестко закодировали список, регулярное выражение или какое-то другое представление разрешенных источников ссылок - оно просто позволяет вам поместить его в отдельный файл)
voretaq7
Не обязательно, если вы посмотрите на мой 2-й блок кода, вы увидите, что это можно сделать ... Мне просто нужно адаптировать его к моему делу ...
AlexV
Вы можете использовать логику очистки во втором блоке кода (или подобную магию только %{HTTP_HOST}для меньшего разбора регулярных выражений), чтобы вставить хост URL-адреса в ваш набор правил, который должен купить вам динамические локальные домены (тщательно тестировать), но вам все равно придется усердно -код "хороших" внешних реферреров, таких как Google (по рефереру, пользовательскому агенту, IP и т. д.)
voretaq7
3

Как насчет написания правила, согласно которому, если referer неизвестен (запрещен), просто вызовите файл Php, в котором вы передаете изображение в качестве параметра, а в файле Php просто выделите большой красный: «этот файл взят из MYWEBSITE.COM и не имеет официального разрешения для показа здесь ".

Что касается вашего вопроса, сделайте ваше правило глобальным. Поправьте меня, если я ошибаюсь, но если правило объявлено перед любым vhost, оно будет применено ко всем vhost (своего рода «правило по умолчанию»).

И другая идея проста: просто перенаправить в файл Php (здесь filter.php), который будет смотреть на авторизованном сайте и вернуть нужный файл, если все в порядке:

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). Я хочу служить только 403. Также с PHP вы должны управлять всеми проблемами кэширования, и это может быть довольно сложным.
AlexV
1

Cloudflare может вам помочь: http://www.cloudflare.com

Это, однако, работает только для изображений, но это то, что вам нужно.

Защита Hotlink

Автоматически включите горячую ссылку для ваших изображений, чтобы предотвратить ссылки за пределами сайта. Реферерам, которые не находятся в зоне и не являются пустыми, будет отказано в доступе. Поддерживаемые расширения файлов: 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 на свой адрес, который вы хотите РАЗРЕШИТЬ, и другие рефереры не смогут загружать изображения
genesis
И как я позволю себе без жесткого кодирования?
AlexV