Определение реферера в PHP - PullRequest
101 голосов
/ 03 октября 2008

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

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

Ответы [ 5 ]

90 голосов
/ 03 октября 2008

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

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

23 голосов
/ 04 декабря 2012

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

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

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

Тогда index.php будет выглядеть так:

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

//Continue with the rest of code

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

14 голосов
/ 27 сентября 2012

Использование $ _ SERVER ['HTTP_REFERER']

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

if (!empty($_SERVER['HTTP_REFERER'])) {
    header("Location: " . $_SERVER['HTTP_REFERER']);
} else {
    header("Location: index.php");
}
exit;
0 голосов
/ 23 июня 2011

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

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

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

0 голосов
/ 03 октября 2008

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

...