Назад | Перейти на главную страницу

Предотвращение хотлинкинга nginx с помощью Cloudflare

Я хочу предотвратить появление на моем сайте хотлинга.

Однако у меня также есть облачная вспышка для обслуживания моего сайта. Я не хочу использовать функцию защиты от хотлинкинга Cloudflare, поскольку она не может исключить внешний домен, в котором я разрешил связывание изображений (а также перенаправлять изображения на изображение, запрещенное горячими ссылками). Таким образом, я хочу предотвратить хотлинкинг на уровне моего сервера.

Проблема в том, что когда я включил его на своем сервере, облачная вспышка будет перенаправлять на изображения, запрещенные горячими ссылками, независимо от того, что это за домен, включая мой собственный домен. Вот коды, которые я использовал:

location ~* \.(gif|png|jpe?g)$ {

  # prevent hotlink
  valid_referers none blocked ~.google. ~.bing. ~.yahoo. allowed-domain.com, server_names ~($host);
  if ($invalid_referer) {
    rewrite (.*) /static/images/hotlink-denied.jpg redirect;
    # drop the 'redirect' flag for redirect without URL change (internal rewrite)
  }
}

location = /static/images/hotlink-denied.jpg { }

Есть ли способ обойти облачность на изображениях?

TL; DR

Вы можете создать правило страницы для изображений, которые не должны быть связаны с горячими ссылками в cloudflare:

Url matches: https://example.com/images/*
The setting: Cache Level: Bypass

Теперь все запросы отправляются на ваш сервер без кеширования, а хотлинкинг блокируется вашим сервером.

Длинный ответ:

Если вы не отключите кеширование, cloudflare добавит ваши успешно связанные изображения в свой CDN, и любой дополнительный запрос горячей ссылки будет успешным, поскольку запрос никогда не поступает на ваш сервер, поэтому его нельзя заблокировать.

Заметка: Защита от горячих ссылок Cloudflare (Scrape Shield) в настоящее время работает только для gif, ico, jpg, jpeg и png. не svg.

Изображения - это ключевой статический ресурс, который вы хотите доставлять через CDN. Это снижает нагрузку на ваш сервер и ускоряет загрузку вашего сайта для посетителей. Однако это может не подходить для некоторых случаев использования.

Я использую CloudFlare для защиты от хотлинков. Как и вы, когда я его выключаю, защита от хотлинков Nginx не работает. Моя конфигурация очень похожа на вашу.

Лучший способ включить хотлинкинг - следовать Инструкции CloudFlare если вы хотите включить хотлинкинг.

В настоящее время вы можете указать определенные URL-адреса, для которых разрешена горячая ссылка, используя параметр «hotlink-ok» в URL-адресе. Так, например, вы можете создать каталог с именем «hotlink-ok» и поместить в него изображения, которые вы хотите использовать для хотлинкинга. Что-то вроде:

http://www.yoursite.com/images/hotlink-ok/someimage.jpg

Вариант второй

Следующий вариант - создать поддомен, разместить его в CloudFlare, но отключить защиту Hotlink. В настоящее время это делается на вкладке «Защита содержимого» в правой части панели управления.

У вас есть два дополнительных варианта

  • Используйте CloudFlare CDN для размещения и обслуживания изображений (горит оранжевое облако). Это снижает нагрузку на ваш сервер и пропускную способность, но делает изображения доступными для всех.
  • Отключите кеширование (серое облако), чтобы CloudFlare работал как DNS-сервер. Используйте Nginx для защиты от хотлинков, как вы это делаете сейчас.

Моя конфигурация Nginx

Вот моя конфигурация Nginx, которая, как и ваша, не работает через CloudFlare.

# Cache images on the client. Don't log errors or access. Block hotlinking.
location ~*  \.(jpg|jpeg|png|gif|css|js|ico|woff|woff2)$ {
  valid_referers none blocked server_names ~($host) ~(googleusercontent|google|bing|yahoo);
  if ($invalid_referer) {
    rewrite (.*) /stop-stealing-images.png redirect;
    # drop the 'redirect' flag for redirect without URL change (internal rewrite)
  }

  # Set up caching - 8 days for static resources. Remove the old unnecessary Pragma and hide the server version
  add_header Cache-Control "public, max-age=691200, s-maxage=691200";
  more_clear_headers Server; more_clear_headers "Pragma"; more_clear_headers "Expires";
}

# This allows the "stop stealing images" image to be hotlinked
location = /stop-stealing-images.png { }

Проверьте строку реферера cloudflare в своих журналах относительно того, что вы туда включаете. Если его нет, вам просто нужно включить его в свою действительную строку рефереров, и он должен работать нормально. :)