Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Адаптация сайта под register_globals off
 
 автор: soloway   (12.12.2007 в 11:15)   письмо автору
 
 

Уважаемые, сильно не бейте... :-)
Предыстория
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.

Пока вроде всё... :-)

   
 
 автор: Faraon   (12.12.2007 в 11:19)   письмо автору
 
   для: soloway   (12.12.2007 в 11:15)
 

Можно покрасивее сделать

$id=$_GET['id'];
include("$id.php"); 

   
 
 автор: soloway   (12.12.2007 в 11:34)   письмо автору
 
   для: Faraon   (12.12.2007 в 11:19)
 

Спасибо.

А вот ещё, сразу идея. Ведь в данном случае я могу и не изменять код в самом индексном файле, а определить все переменные типа $id=$_GET['id']; в файле конфигурации, который подключается к index.php... Соответственно не надо будет парится и с кусками типа include("directoria2/$id.php"); и лазать по всем файлам где эта и аналогичные переменные присутствуют...

Или я не прав?..

   
 
 автор: Thrasher   (12.12.2007 в 11:53)   письмо автору
 
   для: soloway   (12.12.2007 в 11:34)
 

Абсолютно правы, так обычно и делается.

   
 
 автор: Гость   (12.12.2007 в 11:56)   письмо автору
 
   для: Thrasher   (12.12.2007 в 11:53)
 

Я бы рекомендовал только что мы в переменной получем, что бы избежать всяких "неожиданностей"

   
 
 автор: MIchail1982   (12.12.2007 в 12:15)   письмо автору
 
   для: Гость   (12.12.2007 в 11:56)
 

порверяйте $_GET[id] на наличие урлов

   
 
 автор: soloway   (12.12.2007 в 16:49)   письмо автору
 
   для: 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 и т.д., а хотелось бы надпись...:-)

Уважаемые, сам понимаю, что "всё так запущено", но хотя бы натолкните на мысль... Куда копать?

   
 
 автор: sim5   (12.12.2007 в 16:53)   письмо автору
 
   для: soloway   (12.12.2007 в 16:49)
 

Копают всегда в глубь, иначе то никак нельзя. :) А как вы узнаете что страница с id=3 есть, а с id=999 нет? Неужто вам это дает знать preg_match, ведь он у вас служит совсем другим целям, не так ли?

   
 
 автор: soloway   (12.12.2007 в 16:59)   письмо автору
 
   для: sim5   (12.12.2007 в 16:53)
 

>>> он у вас служит совсем другим целям, не так ли?

Вот как раз это-то я и понимаю. Потому и спрашиваю. То что не решу проблему за счет preg_match это ясно. Надо видимо прикрутить ещё одну проверку, на наличие файлов... Как? Ткните меня носом.

А вот я ещё подумал, как это всё в плане ресурсоёмкости... А то может и вообще забить, вернуться к исходникам первого поста... :-)
Плюс конечно в том, что голова работает, но потянет ли сервер...)))

   
 
 автор: sim5   (12.12.2007 в 17:04)   письмо автору
 
   для: soloway   (12.12.2007 в 16:59)
 

Читайте мануал. file_exists - проверяет, существует ли файл.

<?
if (file_exists(intval(trim($_GET['id']))).".php") ...

А возможно вы контент страниц держите в базе, и id это номер запись в таблице, тогда проверяйте существует ли такая запись контента...

PS. Причем для проверки файла intval не обязателен, а вот при запросе к базе - да.

   
 
 автор: soloway   (13.12.2007 в 12:47)   письмо автору
 
   для: 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 может состоять как из букв, так и из цифр.

   
 
 автор: sim5   (13.12.2007 в 13:08)   письмо автору
 
   для: soloway   (13.12.2007 в 12:47)
 

Даже и не знаю куда вас послать, вернее отослать :), чтобы почитать о том, что вас интересует. Ну вот, к примеру, простое:
Основы безопасного кода
Приемы сетевой обороны на PHP
Читать надо как можно больше, разбирать и изучать код, пробовать...

PS. И. Симдянов, думаю, посоветует более полезное по этому поводу, как автор книги "Головоломки для хакеров", если не ошибаюсь, так называется.

   
 
 автор: soloway   (13.12.2007 в 13:26)   письмо автору
 
   для: sim5   (13.12.2007 в 13:08)
 

Насчёт отсыла... :-)

Это на предмет моего вопроса о проверке или весь приведённый в моём предыдущем посте код уязвим?..

ЗЫ. Читать конечно надо, согласен, причём даже читаю... Просто дело в том, что я не программист вобщем-то, да и выучить все тонкости этого ремесла уже явно не смогу в силу многих причин... Хотя, безусловно это не может служить мне оправданием, а лишь усугубляет вину... :-)

   
 
 автор: sim5   (13.12.2007 в 13:35)   письмо автору
 
   для: soloway   (13.12.2007 в 13:26)
 

Вот чтобы понять вам, уязвим кусочек вашего кода, (именно кусочек, ибо защита кода это комплекс мер), вам и нужно читать. Хотите писать код - изучайте вопросы безопасности, не хотите изучать, бросайте писать, по другому нельзя.

   
 
 автор: soloway   (13.12.2007 в 13:48)   письмо автору
 
   для: sim5   (13.12.2007 в 13:35)
 

Повторяю, я ни в коим случае не хочу оспорить Ваше пожелание насчёт чтения, но... Есть много разных "но", обсуждение коих будет флудом здесь.

Вобщем так или иначе, всем большое спасибо, задачу, поставленную в первом посте темы, вы мне решить помогли, всё вроде-бы работает, с безопасностью... Ну хуже видимо явно не стало... С меня, при встрече - магарыч, если вдруг ... :-)
Спасибо!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования