Концепция проста: создайте токен, который будет использоваться в файлах, которые вы хотите защитить.Этот токен (ключ типа «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]
Хотя, это не пуленепробиваемый.