в какой ситуации HTTP_REFERER не работает? - PullRequest
2 голосов
/ 25 мая 2009

Я использовал ранее referrer в foo.php, чтобы решить, относится ли страница iframing к foo.php к определенному URL. (используя $_SERVER['HTTP_REFERER'])

Оказалось, что большую часть времени это работало (около 98% времени), но также казалось, что некоторые пользователи приходили на страницу, и $_SERVER['HTTP_REFERER'] не был установлен в foo.php и поэтому нарушал код. [ update : эти пользователи утверждали, что они следовали обычному потоку страниц и не использовали URL-адрес foo.php в браузере по отдельности (что они позволяют ему быть iframe), и пользователи никогда не менялись их настройки браузера.]

Интересно, по каким причинам это могло произойти?

Ответы [ 2 ]

6 голосов
/ 25 мая 2009

HTTP / 1.1 RFC не обязывает отправлять заголовок реферера HTTP. Вы не можете делать никаких предположений о его наличии при написании надежного кода; браузеры, которые совершенно не соответствуют требованиям, могут его не включать.

Более того, RFC рекомендует, чтобы "Поле Referer НЕ ДОЛЖНО отправляться, если Request-URI был получен из источника, который не имеет своего собственного URI, такого как ввод с клавиатуры пользователя" , и «Мы предлагаем, хотя и не требуем, чтобы пользователю был предоставлен удобный интерфейс переключения, позволяющий включать или отключать отправку информации От и Получателя» * .

Последнее не очень распространено (хотя некоторые браузеры имеют режим «Private», который удовлетворяет требованиям). Более вероятно, что ваши 2% будут добавлены в закладки URL-адресом, который соответствует первому критерию (URI, полученный из источника без URI), и поэтому браузер не отправляет реферер.

1 голос
/ 25 мая 2009

Не по умолчанию AFAIK, но его легко отключить (для конфиденциальности), например. в Firefox через about: config, и, конечно, некоторые пользователи могут использовать распространяемые им браузеры (например, своим ИТ-отделом) с такими настройками. Поэтому вы должны стараться не полагаться на REFERER для каких-либо важных функций (в том числе потому, что, конечно, он неправильно написан; -).

...