А можно я тоже кааапельку повыпендриваюсь?
Код:if (isset ($_GET['id']) and preg_match ("/^\d$/",$_GET['id'])){ include($_GET['id'].".htm"); } else { include("1.htm"); }
А можно я тоже кааапельку повыпендриваюсь?
Код:if (isset ($_GET['id']) and preg_match ("/^\d$/",$_GET['id'])){ include($_GET['id'].".htm"); } else { include("1.htm"); }
"Прежде чем открыть огонь - оглянись!"
А.В. Ворожейкин "Сильнее смерти", стр 9.
"<...>не нужны маркеры противника парням в военном небе Великой Отечественной.
Послюнявили химический карандаш. Пунктиром отметили маршрут на карте. И вперёд!"
© DEDA
1680 x 1050 && i7 2600 (3.4Ghz) && 8 gb DDR3 (1600 Mhz) && gtx 580 && win 7 x64
"Прежде чем открыть огонь - оглянись!"
А.В. Ворожейкин "Сильнее смерти", стр 9.
"<...>не нужны маркеры противника парням в военном небе Великой Отечественной.
Послюнявили химический карандаш. Пунктиром отметили маршрут на карте. И вперёд!"
© DEDA
1680 x 1050 && i7 2600 (3.4Ghz) && 8 gb DDR3 (1600 Mhz) && gtx 580 && win 7 x64
отвал говоришь?
А если нужны цифры только от 3 до 5 и во входящих данных - мусор?
Код:if (preg_match ("/^[\D]*/([3-5]{1}).*$/",$_GET['id'],$id) ){ include($id[1].".htm"); } else { include("1.htm"); }
---------- Добавлено в 19:24 ---------- Предыдущее сообщение было написано в 19:21 ----------
скорее всего 0.htm вряд ли стоит учитывать.
Код:if (preg_match ("/^[\D]*/([1-9][0-9]?).*$/",$_GET['id'],$id) ){ include($id[1].".htm"); } else { include("1.htm"); }
"Прежде чем открыть огонь - оглянись!"
А.В. Ворожейкин "Сильнее смерти", стр 9.
"<...>не нужны маркеры противника парням в военном небе Великой Отечественной.
Послюнявили химический карандаш. Пунктиром отметили маршрут на карте. И вперёд!"
© DEDA
1680 x 1050 && i7 2600 (3.4Ghz) && 8 gb DDR3 (1600 Mhz) && gtx 580 && win 7 x64
И тогда функция вернёт истину на любой набор символов хоть с одной цифрой (если я не ошибаюсь)
Вот за то и не люблю регулярные, что можно написать такого, что сам потом не разберёшь.
Но, конечно, это только отмазка, чтобы мозг не ломать "китайской грамотой".
Если знать их хорошо и функции которые с ними работают, то инструмент мощнейший.
"Прежде чем открыть огонь - оглянись!"
А.В. Ворожейкин "Сильнее смерти", стр 9.
"<...>не нужны маркеры противника парням в военном небе Великой Отечественной.
Послюнявили химический карандаш. Пунктиром отметили маршрут на карте. И вперёд!"
© DEDA
1680 x 1050 && i7 2600 (3.4Ghz) && 8 gb DDR3 (1600 Mhz) && gtx 580 && win 7 x64
Или я ничего не понимаю, или встретив одну цифру в subject, эта функция вернёт не 0, т.е. истину.int preg_match (string pattern, string subject [, array matches [, int flags]])
Ищет в subject совпадения с регулярным выражением, заданным в pattern.
Если matches предоставлен, он заполняется результатами поиска. $matches[0] будет содержать текст, совпавший со всем патэрном, $matches[1] будет содержать текст, совпавший первым захваченным субпатэрном в скобках, и так далее.
Т.е., можно и такую маску задать, но тогда нужно менять условия или инклюдить уже не переменную, а результаты функции (которые ещё выбрать нужно правильно).
Т.е., кроме самого регулярника нужно ещё учитывать что же оно реально делает в функции.
мне функция preg_match не нравится , имхо для таких целей лучше preg_match_all использовать , она не остановится после первого нахождения.
мне больше по душе htmlspecialchars(preg_replace("/[^1-9]/"),"",$id)
В общем , надо память освежить - пошел читать http://php.net/
![]()
Отнесу к последнему выражению.
идёт начало строки, затем мусор (любое количество не-цифр), если затем встречается цифра от 1 до 9 то хорошо, а если после неё будет цифра от 0 до 9 -0 то ещё лучше(не будет второй цифры - фиг с ней, она не обязательна) - запомним эти цифры (потому что в скобках), а всё остальное - остаток строки до конца совпадёт с сочетанием .*(любое количество любых символов), но мы запомним первые попавшиеся цифры, и возьмём их из $id[1] (потому что в $id[0] будет всё что совпало с шаблоном, а в $id[1] - только то, что совпало в первых скобках)
таким образом мы вытащим из строки с мусором число от 1 до 99.
"Прежде чем открыть огонь - оглянись!"
А.В. Ворожейкин "Сильнее смерти", стр 9.
"<...>не нужны маркеры противника парням в военном небе Великой Отечественной.
Послюнявили химический карандаш. Пунктиром отметили маршрут на карте. И вперёд!"
© DEDA
1680 x 1050 && i7 2600 (3.4Ghz) && 8 gb DDR3 (1600 Mhz) && gtx 580 && win 7 x64
Всё правильно, но, согласись, что это всёже не /[0-9]/, подставленное в первый пример.
А ошибки при использовании регулярных выражений вылазят довольно часто даже у профессионалов.
Я только говорю о том, что когда определён конечный словарь того, что может быть в запросе, часто проще и надёжнее запрос проверить в лоб.
Всё, что в $_GET генерируется самим кодом. Если это не бескончная случайная последовательность символов (не может быть любым), то всё что содержит мусор или проще говоря не совпадает с ограниченным числом возможных значений можно просто послать нафиг.
Это и в парсерах логов порой лучше работает, чем регулярное выражение в 14 этажей.
Кстати, спасибо за наводку на книжку - уже читаю.![]()
У нас простейший пример - 2 цифры. В конце концов вполне сойдёт (\d\d?)
Поскольку я - сисадмин, значит профессиональный параноик. Поэтому входной контроль данных - не считаю лишним. Мало ли кто чего пошлёт. Код или не код сгенерировал запрос - я то откуда знаю?
вот - пример - проверка на похожесть ldap rdn с одновременным разбиенем на массив:
а уж про парсинг пчелайновских счетов я вообще молчу(номера, длительность, цена)Код:preg_match_all ("/([^=,]+=[^=,]+),?/",$person,$target)
Джеффри обещал, что книга будет читаться как роман. Не соврал.
"Прежде чем открыть огонь - оглянись!"
А.В. Ворожейкин "Сильнее смерти", стр 9.
"<...>не нужны маркеры противника парням в военном небе Великой Отечественной.
Послюнявили химический карандаш. Пунктиром отметили маршрут на карте. И вперёд!"
© DEDA
1680 x 1050 && i7 2600 (3.4Ghz) && 8 gb DDR3 (1600 Mhz) && gtx 580 && win 7 x64
А можно ещё и вот так:
/^\d+$/ - любое целое число без лишних символов (включая 0)
или
/^[0-9]+$/ -тоже самое
Я теперь тоже по-китайски умею![]()
Так, краткое описание моей задачи и вывод:
1. Есть статическая оболочка сайта-визитки, подгружаемая через 3 вызова include (грубо - "статически шапка", "статически подвал" и "динамически контент").
2. Контент в HTML, причём имя файла значимое, а не цифровое.
3. Исходя из вышеперечисленных условий, а также возможности инъекции черехз вызов "чего попало" любые решения этой задачи, как цифровые, так и списковые, к сожалению, абсолютно неинтересны.
Ибо проще создать кучу контента с двумя статическими вызовами оболочки.
Большое спасибо всем, кто потратил своё время и просветил о нежелательности использования динамического вызова!
Почему зря и откуда у меня список?...
Сегодня содержание такое-то - а завтра хозяин попросил добавить пару html-файлов и двести фото...
Нет, конечно, если ты всерьёз считаешь, что мне проще сделать длинный список, чем вызывать поимённо нужный файл - то я с тобой соглашусь... но чем это будет проще я пока не понимаю.
Ну да. Цифры в полученной переменной могут быть всего лишь номером(ключом) массива из имён файлов(см glob()). Сначала отдаёшь номер элемента массива, содержащего имя файла в ссылку, а при запросе по номеру подгружаешь контент по имени из этого элемента.
Куда уж безопаснее.
Вот так делаем ссылку:
Вот так формируем ответ:Код:<?php $files=glob ($config['incpath']."/files/*jp*"); foreach ($files as $file){ print "<a href=".$SERVER['SCRIPT_NAME']."?id=".$id++.">Файл No $id</a>\n"; } ?>
Напрямую снаружи ничего не берётся. Только подкидывай фалы в папку(если *nix - регистр в имени файла учитывается).
Код:<?php $files=glob ($config['incpath']."/files/*jp*"); if (preg_match ("/(\d+)/",$_GET['id'],$id)){ if (is_file($files[$id[1]])) include($files[$id[1]].".htm"); } else { if (is_file("1.htm")) include("1.htm"); } ?>
Крайний раз редактировалось DogEater; 20.03.2010 в 00:11.
"Прежде чем открыть огонь - оглянись!"
А.В. Ворожейкин "Сильнее смерти", стр 9.
"<...>не нужны маркеры противника парням в военном небе Великой Отечественной.
Послюнявили химический карандаш. Пунктиром отметили маршрут на карте. И вперёд!"
© DEDA
1680 x 1050 && i7 2600 (3.4Ghz) && 8 gb DDR3 (1600 Mhz) && gtx 580 && win 7 x64
Тогда массив где-то хранить надо иначе при добавлении файлов ссылки поплывут.
Ну а как заинъектировать что-то, чего нет в нужной папке в этом случае - я не знаю. Даже если слеши не проверять - include("имяпапки\".$_GET['id'].".hml") или ругнётся или возьмёт что надо. Особенно если подпапок нет.
Ну для пущей перестраховки - перепровериться на слеши или удалить их.
Массив поплывёт только если запрос был до изменения списка файлов.
Судя по задаче - набросать всего, а потом изредка докидывать - считай статичный контент.
"Прежде чем открыть огонь - оглянись!"
А.В. Ворожейкин "Сильнее смерти", стр 9.
"<...>не нужны маркеры противника парням в военном небе Великой Отечественной.
Послюнявили химический карандаш. Пунктиром отметили маршрут на карте. И вперёд!"
© DEDA
1680 x 1050 && i7 2600 (3.4Ghz) && 8 gb DDR3 (1600 Mhz) && gtx 580 && win 7 x64
он поплывёт если изменения внесены между отправкой ссылки и получением запроса.
Т.е. "прощай избранное и обмен ссылками"
Да и сегодня вообще "модно" когда ссылка осмысленная - при желании можно и без переменных вообще обойтись - прямо в путь имя файла прописывать, rewrite-ом перенаправлять(на апаче)
Крайний раз редактировалось Mirnyi; 20.03.2010 в 00:37.