PHP-код для anti hotlinking

На наших сайтах мы занимаемся секцией защиты изображений. Поэтому, как часть защиты изображений, нам нужно предоставить антихотлинкинг для изображений. На нашем сайте мы показываем изображение с использованием сгенерированного URL-адреса.

Например, на нашем сайте источник изображения выглядит так: image_file.php?type=image&w=10&h=10&i=12

(это только поддельный URL, например, цель).

Поэтому, используя этот URL-адрес, нам нужно показать изображение на нашем сайте и в то же время хотите предотвратить его от горячей ссылки, есть ли способ предотвратить хотлинкинг?

Обратное хотлинкинг обычно определяется реферированием, но он не будет работать, если:

  • пользователь отключил отправку реферала в своем браузере (у меня это для целей конфиденциальности)
  • страница просматривается через HTTPS (браузер не должен отправлять данные реферера).

Вы заблокируете фактических пользователей от просмотра изображений.

Рассмотрите возможность использования сеансов / файлов cookie при решении этой проблемы. Затем вам придется передавать каждое изображение через php-скрипт.

Если вы можете использовать метод .htaccess, то, кроме того, как я уже сказал в своем комментарии, 100% -ный способ доказательства – использовать кодировку base64. Когда вы показываете изображения, вы можете использовать этот код для преобразования их в base64:

 <?php $imagedata = file_get_contents("/path/to/image.png"); $base64 = base64_encode($imagedata); ?> <img src="data:image/jpeg;base64,<?= $base64; ?>" /> 

Кроме того, если вы хотите стать действительно творческим, вы можете «RAT» получить «воровские» ссылки, отобразив альтернативное изображение, используя ваш файл .htaccess … сделайте это так:

 RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://(www\.)?mydomain.com/.*$ [NC] RewriteRule \.(gif|jpg|png)$ http://www.mydomain.com/dontstealmystuff.png [R,L] 

просто убедитесь, что dontstealmystuff.png доступен на сервере

базовый пример .htaccess

 RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC] RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L] 

выше позволяет пустой REFERER (например, я).

это не означает:

 RewriteEngine on RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC] RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L] 

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

Вообще говоря, правильный способ сделать это – это что-то вроде файла .htaccess с такой командой, как:

 RewriteEngine On RewriteCond %{HTTP_REFERER} !^http://(.+\.)?somesite\.com/ [NC] RewriteCond %{HTTP_REFERER} !^$ RewriteRule .*\.(jpe?g|gif|bmp|png)$ http://img.ruphp.com/php/aNbhd.jpg [L] 

Однако для этого в PHP это в основном то же самое. Все, что вы делаете, это проверить, что $ _SERVER ['HTTP_REFERER'] начинается с URL-адреса страницы. Однако можно обмануть HTTP_REFERER, чтобы он не составлял 100%. Однако пользователь должен это сделать (внешний сайт довольно (в основном …) многое не может обмануть это), поэтому он не позволит другим сайтам встраивать ваши изображения, не помещая ваш сайт в iframe или какой-либо другой hoopla.

Другой способ и, вероятно, самый безопасный, хотя он будет самым сложным на сервере, заключается в использовании переменной $ _SESSION для передачи маркера / флага, а затем проверить токен.

 session_start(); $_SESSION["allow_images"] = true; 

Затем на странице PHP, которая получает изображение для них:

 if($_SESSION["allow_images"]) { //Send some pics! } 

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

Вы можете попробовать проверить значение $_SERVER['HTTP_REFERER'] на известное значение, но, как указано в документации , это может быть подделано. Однако это может помочь против общего дела.

в image_file.php для этого используйте http_referer.

 $ref = isset($_SERVER['HTTP_REFERER'])? $_SERVER['HTTP_REFERER']: ""; if ($ref != "" && strpos($ref,'http://www.yourdomain.com/')===0) { //the request for this image is coming from some other domain, so take appropriate action } else { //do whatever logic you are currently using to show the images } 

Найдите полномасштабное решение здесь: http://safalra.com/programming/php/prevent-hotlinking/