Блокировать изображения, CSS или JS, если пользователь не посещал мой сайт - PullRequest
17 голосов
/ 06 октября 2011

Я неожиданно получаю много запросов на свой сайт (wget, curl и т. Д.).

Я не хочу, чтобы какой-либо из этих запросов выполнялся , если только пользователь не посетил мой сайт хотя бы один раз, используя действующий браузер (например, Firefox или Chrome).

Есть ли модуль Apache для этого? Что я могу сделать?

1 Ответ

24 голосов
/ 12 октября 2011

Концепция проста: создайте токен, который будет использоваться в файлах, которые вы хотите защитить.Этот токен (ключ типа «abc123» - сохраненный в сеансе, а не куки) будет использоваться в каждом загружаемом файле.Таким образом, если токен не совпадает с файлом, вы можете перенаправить его на страницу, которая не найдена или доступ запрещен.

Настройте токен в index.php:

<?php
  session_start();
  header("Cache-Control: no-cache, must-revalidate");
  header("Expires: Mon, 10 Oct 2005 05:00:00 GMT");
  $_SESSION['siteToken'] = "abc123";
?>

<html>
<head> 
  <link rel="stylesheet" type="text/css" href="/style.css" />
</head>
<body>

Теперь дляФайлы CSS и JavaScript. Необходимо проверить токен, чтобы убедиться, что он установлен и имеет правильное значение.

// style.css
<?php
  session_start();
  header("Content-type: text/css");
  header("Cache-Control: no-cache, must-revalidate");
  header("Expires: Mon, 10 Oct 2005 05:00:00 GMT");
  if($_SESSION["siteToken"] != "abc123") {
    session_regenerate_id();
    die(); // or redirect
  } 
?>
body { background-color: #000; color: #fff; }
etc...

То же самое вы делаете для файла JavaScript.

Следующий шаг, есливы обновляете ваш .htaccess, чтобы убедиться, что файлы CSS и JavaScript анализируются правильно:

RewriteEngine on
RewriteBase /
RewriteRule style.css style.php [NC,L]

Кроме того, вы можете добавить это в свой .htaccess для защиты плохих ботов от запросов к файлам:

SetEnvIfNoCase User-Agent "^Wget" bad_bot
SetEnvIfNoCase User-Agent "^EmailSiphon" bad_bot
SetEnvIfNoCase User-Agent "^EmailWolf" bad_bot
SetEnvIfNoCase User-Agent "^libwww-perl" bad_bot
#etc...
Deny from env=bad_bot

Теперь что касается изображений.Это решение также будет работать, но оно будет медленнее, чем синтаксический анализ файлов CSS и JavaScript.Логика та же, но вместо эха вы должны прочитать файл (используя readfile).Кроме того, вы должны изменить заголовок в зависимости от расширения файла.

Альтернативой для этого будет установка этого в вашем файле .htaccess:

RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?domain.com [NC]
RewriteRule \.jpg$ - [NC,F,L]

Хотя, это не пуленепробиваемый.

...