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

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

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


person UnkwnTech    schedule 03.10.2008    source источник
comment
Почему вы говорите, что $_SERVER['HTTP_REFERER'] ненадежен?   -  person Milan Babuškov    schedule 03.10.2008
comment
Реализация PHP надежна. Проблема в том, что ни один браузер не отправляет это, и вы даже можете изменить его, если хотите. Так что ненадежно, что это правильно со стороны клиента.   -  person Biri    schedule 03.10.2008
comment
Возможный способ — поместить уникальный ключ (например, GUID) в одно поле вашей страницы и отправить его обратно в следующем запросе.   -  person PhiLho    schedule 03.10.2008
comment
Узнайте IP-адрес сервера и используйте $_SERVER[REMOTE_ADDR].   -  person    schedule 08.07.2011


Ответы (5)


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

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

person Seldaek    schedule 03.10.2008
comment
Если вы хотите использовать этот метод, вам все равно следует проверять реферер, чтобы предотвратить CSRF en.wikipedia .org/wiki/Кросс-сайт_request_forgery - person JD Isaacks; 13.09.2010
comment
В идеале вы должны использовать уникальный токен для сеанса для каждого пользователя (для каждого запроса, если вы параноик), чтобы предотвратить атаки CSRF. Проверка реферера — это просто безопасность путем обфускации, а не совсем реальное решение. - person Seldaek; 30.12.2010
comment
@ Seldaek нет, проверка реферера не является «безопасностью путем обфускации». Злоумышленник, пытающийся выполнить атаку CSRF, не может контролировать реферер, отправленный браузером жертвы, поэтому его проверка защищает от CSRF. Однако я поддержу ваш вывод о том, что вместо этого вам следует использовать токен CSRF, поскольку подход с проверкой реферера имеет недостатки, в том числе делает вас уязвимым, если у вас есть открытое перенаправление на вашем сайте, и ломает пользовательские агенты, которые удаляют реферер. - person Mark Amery; 20.05.2014
comment
@MarkAmery, конечно, все зависит от того, от чего вы пытаетесь защититься, но использование специфичных для клиента http-заголовков в целом не является очень надежной моделью безопасности. - person Seldaek; 20.05.2014

Лучше всего я нашел токен 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

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

person We0    schedule 04.12.2012

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

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

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

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

person gizmo    schedule 03.10.2008

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

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

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

person justnajm    schedule 23.06.2011