• Записи 162
  • Теги 66
  • Комментарии 330

Компьютерное

Безопасный редирект или как защититься от спамвертайзинга

Сегодня получил письмо от хостера, в котором говорилось, что на один из моих сайтов поступила жалоба на спамвертайзинг, и приводился пример спамного письма. Из него выяснилось, что на самом деле спамом рекламируется совершенно другой сайт, а от моего используется только скрипт, который делал редирект со статусом 301 на указанный ему в параметрах адрес.
Таким образом, в современных условиях наличие на сайте скрипта, который позволяет делать редирект без какой-либо проверки, небезопасно. Возникла мысль, как можно его защитить, но при этом не слишком усложнять. Решение нашлось быстро: передаем в скрипт редиректа два параметра, один из которых — это сам URL, второй — хеш, который считается от URL и некоторой строки-ключа. Редирект происходит только тогда, когда рассчитанный на основе URL хеш совпадет с переданным, в остальных случаях выдается ошибка 404. (Естественно, при этом придется поправить все те места на сайте, где генерируется ссылка на скрипт с редиректом, чтобы рассчитать и добавить хеш.) В результате получаем вот такой скрипт:

<?php
define('KEY','some secret key');
if (!empty($_GET['url']) && !empty($_GET['key']) && md5($_GET['url'].KEY)===$_GET['key']) {
 header('HTTP/1.0 301 Moved Permanently');
 header('Location: '.$_GET['url']);
 exit();
}
else {
 header('HTTP/1.0 404 Not Found');
 echo 'No location or bad key specified.';
}

3 комментария:

Нет
Павлуха
0

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

Нет
Павлуха
0

Хм.. Хотел использовать код, не понял вот этот момент: md5($_GET['key'].KEY)===$_GET['key'])
Может быть, md5($_GET['url'].KEY) имеется ввиду? В другом случае интересно посмотреть алгоритм создания $_GET['key']

4X_Pro
0

Как обычно, моя невнимательность. Должно быть так: md5($_GET[’url’].KEY)===$_GET[’key’])
Т.е. мы берем MD5-хеш от URL и нашего секретного ключа и сравниваем его с тем, что пришло в параметре key запроса.

Написать комментарий


Задать вопрос