Определение реферера в PHP

каков наиболее надежный и безопасный способ определить, какая страница отправлена или вызвана (через AJAX) текущей страницей. Я не хочу использовать $_SERVER['HTTP_REFERER'], из-за (отсутствия) надежности, и мне нужно, чтобы страница вызывалась только из запросов, возникающих на моем сайте.

Edit: я ищу, чтобы убедиться, что сценарий, который предварительно формирует серию действий, вызывается со страницы на моем сайте.

5 ответов


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

Если вы хотите проверить, поступает ли запрос с вашего сайта, вы не можете, но вы можете проверить, что пользователь был на вашем сайте и / или аутентифицирован. Куки-файлы отправляются в AJAX-запросах, поэтому вы можете положиться на это.


то, что я нашел лучше всего, - это токен CSRF и сохраните его в сеансе для ссылок, где вам нужно проверить реферера.

поэтому, если вы генерируете обратный вызов FB, то он будет выглядеть примерно так:

$token = uniqid(mt_rand(), TRUE);
$_SESSION['token'] = $token;
$url = "http://example.com/index.php?token={$token}";

затем индекс.PHP будет выглядеть так:

if(empty($_GET['token']) || $_GET['token'] !== $_SESSION['token'])
{
    show_404();
} 

//Continue with the rest of code

Я знаю безопасные сайты, которые делают эквивалент этого для всех своих безопасных страниц.


С помощью переменная$_SERVER['HTTP_REFERER']

адрес страницы (если таковой имеется), на которую ссылается агент пользователя текущая страница. Это задается агентом пользователя. Не все агенты пользователей будут установите это, а некоторые предоставляют возможность изменять HTTP_REFERER как особенность. Короче говоря, ему нельзя доверять.

if (!empty($_SERVER['HTTP_REFERER'])) {
    header("Location: " . $_SERVER['HTTP_REFERER']);
} else {
    header("Location: index.php");
}
exit;

нет надежного способа проверить это. Это действительно под рукой клиента, чтобы сказать вам, откуда он пришел. Вы можете себе представить, чтобы использовать cookie или сеансы информации, помещенные только на некоторых страницах вашего сайта, но это нарушит пользовательский опыт с закладками.


У нас остался только один вариант после прочтения всех поддельных проблем реферера: т. е. Страница, которую мы хотим отслеживать как реферер, должна храниться в сеансе, и как ajax назвал затем проверку в сеансе, если у нее есть значение страницы реферера и выполнение действия другим образом нет действия.

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

помните, что переменная сеанса устанавливается только в запросе страницы желания.