Ответ 1
Концепция проста: создайте токен, который будет использоваться в файлах, которые вы хотите защитить. Эта Этот токен (такой как "abc123" - сохраненный в сеансе, а не файлы cookie) будет использоваться в каждом загружаемом файле. Таким образом, если токен не совпадает с файлом, вы можете перенаправить на страницу, которая не найдена или недоступна.
Установите маркер в 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]
Хотя, это не пуленепробиваемый.