| |
|
|
| | Уважаемые, сильно не бейте... :-)
Предыстория
1. Есть файл шаблона index.php, в нём, в нужном месте код: <?php include("$id.php"); ?>
2. Есть файлы с информацией - 1.php, 2.php, 3.php ... 999.php
3. Есть ссылки типа index.php?id=1, index.php?id=2, index.php?id=3 ... index.php?id=999, по которым, как вы понимаете, в файл index.php инклюдится содержимое соответствующего файла с информацией, например 273.php...
Установил вчера на локальный комп PHP5 и из-за отключенного по дефолту register_globals сразу столкнулся с проблемой. Можно было конечно пойти по пути включения register_globals, но решил "причесать" проект под register_globals = Off
Не буду описывать своих мытарств, скажу только, что в итоге заменил <?php include("$id.php"); ?> на <?php include $_GET['id'].'.php' ?>
В принципе вроде заработало, но...
Есть несколько вопросов:
1. Что-то мне подсказывает, что <?php include $_GET['id'].'.php' ?> - это ужасно, можно как-то "по-красивее" написать?
2. Можно ли из этого <?php include $_GET['id'].'.php' ?> как-то вообще выкинуть расширение файла, что бы скажем в случае с изображениями грузились все присутствующие в данной директории картинки, независимо от расширения, а только по id, т.е. имени файла?.. У меня не получилось. И кстати, не опасно ли это?
3. Будет ли конструкция типа $_GET['id'] корректно работать при включенном register_globals и на 4х версиях PHP.
Пока вроде всё... :-) | |
| |
|
|
| |
|
|
| |
для: soloway
(12.12.2007 в 11:15)
| | | Можно покрасивее сделать
$id=$_GET['id'];
include("$id.php");
|
| |
| |
|
|
| |
|
|
| |
для: Faraon
(12.12.2007 в 11:19)
| | | Спасибо.
А вот ещё, сразу идея. Ведь в данном случае я могу и не изменять код в самом индексном файле, а определить все переменные типа $id=$_GET['id']; в файле конфигурации, который подключается к index.php... Соответственно не надо будет парится и с кусками типа include("directoria2/$id.php"); и лазать по всем файлам где эта и аналогичные переменные присутствуют...
Или я не прав?.. | |
| |
|
|
| |
|
|
| |
для: soloway
(12.12.2007 в 11:34)
| | | Абсолютно правы, так обычно и делается. | |
| |
|
|
| |
|
|
| |
для: Thrasher
(12.12.2007 в 11:53)
| | | Я бы рекомендовал только что мы в переменной получем, что бы избежать всяких "неожиданностей" | |
| |
|
|
| |
|
|
| |
для: Гость
(12.12.2007 в 11:56)
| | | порверяйте $_GET[id] на наличие урлов | |
| |
|
|
| |
|
|
| |
для: MIchail1982
(12.12.2007 в 12:15)
| | | Спасибо, вы все мне очень помогли.
Теперь вот ещё вопрос в догонку. Родил я нечто вот такое
if (preg_match("/[0-9]+$/", $id)){include ("$id.php");}
else print ('нету такой страницы');
|
Сейчас в принципе неважно по чему проверять, просто пока модель, мне надо самому разобраться. Но в принципе, насколько я понял, для "проверки на урлы" надо быдет сделать примерно так: if (preg_match("/[0-9]+$/", $id))... Если не прав, поправьте, плз, но сейчас не это главное.
У меня представленная в коде конструкция работает, при переходе на index.php?id=3 выводит контент из файла 3.php, при попытке перехода на index.php?id=abc, как и положено надпись, что нет страницы. Но тут вот ещё что...
Мне бы хотелось сделать так, что бы при значении $id, несоответствующем имени существующих файлов, так же выводилась надпись, что страницы нет. У меня же пока при попытке перехода по ссылке index.php?id=999 и отсутствии файла 999.php выводит стандартное include(999.php) [function.include]: failed to open stream и т.д., а хотелось бы надпись...:-)
Уважаемые, сам понимаю, что "всё так запущено", но хотя бы натолкните на мысль... Куда копать? | |
| |
|
|
| |
|
|
| |
для: soloway
(12.12.2007 в 16:49)
| | | Копают всегда в глубь, иначе то никак нельзя. :) А как вы узнаете что страница с id=3 есть, а с id=999 нет? Неужто вам это дает знать preg_match, ведь он у вас служит совсем другим целям, не так ли? | |
| |
|
|
| |
|
|
| |
для: sim5
(12.12.2007 в 16:53)
| | | >>> он у вас служит совсем другим целям, не так ли?
Вот как раз это-то я и понимаю. Потому и спрашиваю. То что не решу проблему за счет preg_match это ясно. Надо видимо прикрутить ещё одну проверку, на наличие файлов... Как? Ткните меня носом.
А вот я ещё подумал, как это всё в плане ресурсоёмкости... А то может и вообще забить, вернуться к исходникам первого поста... :-)
Плюс конечно в том, что голова работает, но потянет ли сервер...))) | |
| |
|
|
| |
|
|
| |
для: soloway
(12.12.2007 в 16:59)
| | | Читайте мануал. file_exists - проверяет, существует ли файл.
<?
if (file_exists(intval(trim($_GET['id']))).".php") ...
|
А возможно вы контент страниц держите в базе, и id это номер запись в таблице, тогда проверяйте существует ли такая запись контента...
PS. Причем для проверки файла intval не обязателен, а вот при запросе к базе - да. | |
| |
|
|
| |
|
|
| |
для: sim5
(12.12.2007 в 17:04)
| | | Спасибо, Вы мне очень помогли.
Уфф.
Вобщем вот что у меня вышло:
$id=$_GET['id'];
if (preg_match("/[0-9]+$/", $id))
{
if (file_exists(trim($_GET['id'].".php")))
include $_GET['id'].'.php';
else
echo 'Запрошенный файл не существует';
}
else echo 'Данная ссылка недействительна';
|
Вроде бы работает.
И ещё, посоветуйте как лучше (каким выражением) проверить вводимые данные - if (preg_match("/[0-9]+$/", $id)), что бы не получить из них какой бяки... Планируется, что $id может состоять как из букв, так и из цифр. | |
| |
|
|
| |
|
|
| |
для: soloway
(13.12.2007 в 12:47)
| | | Даже и не знаю куда вас послать, вернее отослать :), чтобы почитать о том, что вас интересует. Ну вот, к примеру, простое:
Основы безопасного кода
Приемы сетевой обороны на PHP
Читать надо как можно больше, разбирать и изучать код, пробовать...
PS. И. Симдянов, думаю, посоветует более полезное по этому поводу, как автор книги "Головоломки для хакеров", если не ошибаюсь, так называется. | |
| |
|
|
| |
|
|
| |
для: sim5
(13.12.2007 в 13:08)
| | | Насчёт отсыла... :-)
Это на предмет моего вопроса о проверке или весь приведённый в моём предыдущем посте код уязвим?..
ЗЫ. Читать конечно надо, согласен, причём даже читаю... Просто дело в том, что я не программист вобщем-то, да и выучить все тонкости этого ремесла уже явно не смогу в силу многих причин... Хотя, безусловно это не может служить мне оправданием, а лишь усугубляет вину... :-) | |
| |
|
|
| |
|
|
| |
для: soloway
(13.12.2007 в 13:26)
| | | Вот чтобы понять вам, уязвим кусочек вашего кода, (именно кусочек, ибо защита кода это комплекс мер), вам и нужно читать. Хотите писать код - изучайте вопросы безопасности, не хотите изучать, бросайте писать, по другому нельзя. | |
| |
|
|
| |
|
|
| |
для: sim5
(13.12.2007 в 13:35)
| | | Повторяю, я ни в коим случае не хочу оспорить Ваше пожелание насчёт чтения, но... Есть много разных "но", обсуждение коих будет флудом здесь.
Вобщем так или иначе, всем большое спасибо, задачу, поставленную в первом посте темы, вы мне решить помогли, всё вроде-бы работает, с безопасностью... Ну хуже видимо явно не стало... С меня, при встрече - магарыч, если вдруг ... :-)
Спасибо! | |
| |
|
|