PHP: что лучший способ состоит в том, чтобы проверить равенство $ _SERVER ['HTTP_REFERER']?

У меня есть Сценарий PHP, который проверяет Referer HTTP.

if ($_SERVER['HTTP_REFERER'] == 'http://www.example.com/') {...}

Однако это кажется по сути небезопасным... потому что, что происходит, если пользователь переходит в 'http://example.com/' или 'http://www.ExaMple.com' (оба из которых не соответствуют тесту равенства).

Вопрос: что является лучшим тестом равенства, чтобы гарантировать, что Referer HTTP прибывает из 'example.com' ?

5
задан rook 5 April 2010 в 20:18
поделиться

5 ответов

Используя регулярное выражение, это будет

if(preg_match("%(http://)?(www\.)?example\.com(/)?%i",$_SERVER['HTTP_REFERER'])) { ... }
0
ответ дан 14 December 2019 в 19:08
поделиться

Надеюсь, вы не проверите ничего существенного.

вы можете использовать функцию parse_url (), чтобы получить часть имени хоста и проверить, действительно ли HTTP_REFERER содержит URL-адрес.
вы также можете просто указать www. от имени хоста.
регистр символов не важен, так как он всегда строчный

или используется регулярное выражение.

1
ответ дан 14 December 2019 в 19:08
поделиться

Обязательный ответ: HTTP_REFERER можно подделать, поэтому невозможно быть на 100% уверенным, что кто-то пришел с определенного веб-сайта.

Однако, если вы действительно хотите полагаться на него, вы можете использовать регулярное выражение для поиска «example.com» в HTTP_REFERER. stristr () также будет работать и, вероятно, будет рекомендован, поскольку он будет быстрее, чем регулярное выражение. Он также нечувствителен к регистру, поэтому ему будет соответствовать "ExaMple.com", а также "example.com".

1
ответ дан 14 December 2019 в 19:08
поделиться
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)) {...}
0
ответ дан 14 December 2019 в 19:08
поделиться

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 легко может быть заполнен мусором.

3
ответ дан 14 December 2019 в 19:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: