php регулярное выражение проверяет фрагмент URL по списку

0

Я пытаюсь проверить реферер на странице против списка разрешенных источников. Я извлек часть 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"
  • 1
    Можете ли вы привести небольшой примерный список допустимых исходных файлов?
  • 0
    Конечно, есть один пример в вопросе (view.php), но другие допустимые имена файлов - detail.php, request.php, Overview.php. Я сделал это с массивом, потому что я хочу простой способ добавить больше в будущем.
Показать ещё 3 комментария
Теги:
validation

2 ответа

0
Лучший ответ

Поместите скрипты внутри группы:

$fragOK = preg_match('/(?:'.implode('|', $okSrc).')\?id=[0-9]+$/', $frag);
//              here __^^^                  and __^

Вы можете также использовать preg_quote на $ okStr, чтобы избежать точек.

  • 0
    Это место на спасибо. Мне приятно видеть, насколько я был близок, и узнавать что-то новое. Большое спасибо.
  • 0
    почему?: ему нужно сопоставить имя файла из списка, достаточно добавить круглые скобки, и точки в имени файла не должны влиять, но для большей безопасности рекомендуется использовать preg_quote.
Показать ещё 6 комментариев
0

Проблема в том, что у вас нет строк, окруженных скобками.

посмотреть эту демонстрацию

Обновить: '.' в view.php, например, не повлияет на совпадение

  • 0
    Спасибо, что нашли время ответить, но, боюсь, я понятия не имею, как читать демонстрацию, на которую вы ссылаетесь - я не постоянный пользователь регулярных выражений. Ответ ниже от JE SUIS CHARLIE работает отлично.
  • 0
    На самом деле, если вы видите правую верхнюю часть ОБЪЯСНЕНИЯ по этой ссылке, у вас есть все регулярное выражение, объясненное на обычном английском языке. Здорово, когда вы начинаете изучать регулярные выражения.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню