Каков самый надежный и безопасный способ определить, какая страница либо отправлена, либо вызвана (через AJAX) текущей страницей. Я не хочу использовать $_SERVER['HTTP_REFERER']
из-за (отсутствия) надежности, и мне нужно, чтобы вызываемая страница исходила только из запросов, исходящих с моего сайта.
Редактировать: я ищу убедитесь, что скрипт, выполняющий ряд действий, вызывается со страницы моего веб-сайта.
Определение реферера в PHP
Ответы (5)
REFERER отправляется браузером клиента как часть протокола HTTP и поэтому действительно ненадежен. Его может не быть, он может быть подделан, вы просто не можете ему доверять, если это из соображений безопасности.
Если вы хотите проверить, поступает ли запрос с вашего сайта, вы не можете этого сделать, но вы можете убедиться, что пользователь был на вашем сайте и/или аутентифицирован. Файлы cookie отправляются в запросах AJAX, поэтому вы можете на это положиться.
Лучше всего я нашел токен 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
Я знаю безопасные сайты, которые делают то же самое для всех своих защищенных страниц.
$_GET['token'] == $_SESSION['token']
, а не $_GET['token'] !== $_SESSION['token']
?
- person Timo Huovinen; 19.02.2014
Использование $_SERVER['HTTP_REFERER']
Адрес страницы (если есть), с которой пользовательский агент перешел на текущую страницу. Это устанавливается агентом пользователя. Не все пользовательские агенты будут устанавливать это, а некоторые предоставляют возможность изменять HTTP_REFERER как функцию. Короче говоря, этому нельзя доверять.
if (!empty($_SERVER['HTTP_REFERER'])) {
header("Location: " . $_SERVER['HTTP_REFERER']);
} else {
header("Location: index.php");
}
exit;
Нет надежного способа проверить это. Это действительно под рукой клиента, чтобы сказать вам, откуда он взялся. Вы могли бы использовать файлы cookie или информацию о сеансах, размещенную только на некоторых страницах вашего веб-сайта, но это нарушило бы работу пользователя с закладками.
После прочтения всех проблем с фальшивыми реферерами у нас остался только один вариант: т.е. страница, которую мы хотим отслеживать как реферер, должна оставаться в сеансе, а при вызове ajax затем проверять в сеансе, имеет ли она значение страницы реферера, и выполнять действие, иначе нет действие.
В то время как, с другой стороны, когда он запрашивает любую другую страницу, сделайте значение сеанса реферера равным нулю.
Помните, что переменная сеанса устанавливается только при запросе желаемой страницы.
$_SERVER[REMOTE_ADDR]
. - person   schedule 08.07.2011