Я пытаюсь проверить реферер на странице против списка разрешенных источников. Я извлек часть URL-адреса реферера после последнего "/" и теперь хочу проверить его на список допустимых источников. Действительные фрагменты будут в форме [filename] [? Id = nnn] без каких-либо других допустимых символов, например "view.php? Id = 1" в порядке, а "view.php? Id = 1 & nasty = 1" недействителен.
Метод, который я пытаюсь сделать:
$fragOK = preg_match('/'.implode('|', $okSrc).'\?id=[0-9]+$/', $frag);
где $ okSrc - массив допустимых имен исходных файлов, а $ frag - извлеченная строка. Очевидно, что с этим что-то не так, потому что $ fragOK === 1 с обоими примерами, приведенными выше. Может кто-нибудь объяснить, где я ошибаюсь, пожалуйста?
Обновление с помощью var_dumps:
----------------------------------------------------
$okSrc
----------------------------------------------------
array(4) {
[0]=>
string(8) "view.php"
[1]=>
string(10) "detail.php"
[2]=>
string(11) "request.php"
[3]=>
string(12) "overview.php"
}
----------------------------------------------------
$frag
----------------------------------------------------
string(21) "view.php?id=1&nasty=1"
Поместите скрипты внутри группы:
$fragOK = preg_match('/(?:'.implode('|', $okSrc).')\?id=[0-9]+$/', $frag);
// here __^^^ and __^
Вы можете также использовать preg_quote
на $ okStr, чтобы избежать точек.
Проблема в том, что у вас нет строк, окруженных скобками.
посмотреть эту демонстрацию
Обновить: '.' в view.php, например, не повлияет на совпадение