У меня есть Сценарий PHP, который проверяет Referer HTTP.
if ($_SERVER['HTTP_REFERER'] == 'http://www.example.com/') {...}
Однако это кажется по сути небезопасным... потому что, что происходит, если пользователь переходит в 'http://example.com/'
или 'http://www.ExaMple.com'
(оба из которых не соответствуют тесту равенства).
Вопрос: что является лучшим тестом равенства, чтобы гарантировать, что Referer HTTP прибывает из 'example.com'
?
Используя регулярное выражение, это будет
if(preg_match("%(http://)?(www\.)?example\.com(/)?%i",$_SERVER['HTTP_REFERER'])) { ... }
Надеюсь, вы не проверите ничего существенного.
вы можете использовать функцию parse_url (), чтобы получить часть имени хоста и проверить, действительно ли HTTP_REFERER содержит URL-адрес.
вы также можете просто указать www. от имени хоста.
регистр символов не важен, так как он всегда строчный
или используется регулярное выражение.
Обязательный ответ: HTTP_REFERER можно подделать, поэтому невозможно быть на 100% уверенным, что кто-то пришел с определенного веб-сайта.
Однако, если вы действительно хотите полагаться на него, вы можете использовать регулярное выражение для поиска «example.com» в HTTP_REFERER. stristr ()
также будет работать и, вероятно, будет рекомендован, поскольку он будет быстрее, чем регулярное выражение. Он также нечувствителен к регистру, поэтому ему будет соответствовать "ExaMple.com", а также "example.com".
if (strtolower($_SERVER['HTTP_REFERER']) == 'http://www.example.com/') {...}
Как насчет ...
$parts = explode('/',$_SERVER['HTTP_REFERER']);
if (in_array('example.com',$parts) || in_array('www.example.com',$parts)) {...}
parse_url () в сочетании с небольшими манипуляциями со строками должны делать то, что вы хотите. Попробуйте следующее:
$url = parse_url($_SERVER['HTTP_REFERER']);
//take the last two 'dot segments' of the host
$hostOnly = implode('.',array_slice(explode('.',$url['host']),-2));
if (strtolower($hostOnly) == 'example.com') {
//stuff
}
Обратите внимание, что parse_url () может дать сбой на неправильно сформированных URL-адресах, поэтому вы можете захотеть добавить некоторую проверку ошибок, чтобы быть в безопасности. HTTP_REFERER легко может быть заполнен мусором.