![]() |
Переход по страницам на PHP
Привет, недавно начал изучать PHP, и вот пишу сайт.
Имеется главная страница index.php. На ней есть таблица, слева линк $PHP_SELF?action=states, а справа прописано include($inc); В index.php лежит скрипт типа: if ($action == "states"){ $inc="states.php"; } При нажатии все нормально загружается. На states.php у мен лежит линк такого соджержания $PHP_SELF?action=states&st=01 Вопрос: Как сделать чтобы при нажатии на этот линк страница открывалась здесь же. Я пытался сам написать, и вот что вышло: index.php if ($action == "states") { $inc="states.php" if ($st == $st and $st != "") { $inc="states/$st.htm"; } } Все бы ничего, но если ввести неправильно сформированный запрос, то можно читать любые файлы на сервере :) Вариант с else {$inc="error.htm";} не прокатывает, так как при заходе на states.php вылезает error.htm |
fossil
я думаю что настоящая проблемма заключается в том что вы не знаете как это все можно организовать с помощью другово метода? |
Vlad Drakula
Именно так. Ну или возможно как-то переделать этот. Хотя я думал над ним долго.... |
fossil
если вы опишите свою задачу более подробдо, то я скорее всего смогу предложить вам более простой вариант решения. |
Первая страница (index.php) является как бы шаблоном. Остальные страницы в меню инклюдиться таким образом include("$inc"); Меню имеет вид $PHP_SELF?action=
В зависимости от линка присваиваются параметры :) Тут же эти линки обрабатываются и инклюдится нужная страница. Например if ($action == "states"){ $inc="states.php"; } С этим впринципе проблем не возникает. На странице states.php лежат линки с параметрами $PHP_SELF?action=states&st= в переменную st присваивается номер статьи. Все статьи лежат в каталоге states в htm. Така как у меня states.php инклудится, то все линки на states.php следовательно должны обрабатываться в index.php и инклудиться. Например у меня в states.php лежит линк $PHP_SELF?action=states&st=01 Следовательно я дописал в index.php следующие строки: if ($action == "states") { $inc="states.php" if ($st == $st and $st != "") { $inc="states/$st.htm"; } } Получается что когда я жму на линк в инклуженном states.php инклудится статья /states/$st.htm (где $st номер статьи). Вот впринципе и все. Если например сделать запрос http://mysite.ru/index.php?action=st.../etc/passwd%00 нам выведется его содержимое :) Надо же сделать если ввести что либо другое, то вместо /states/$st.htm инклудилась error.htm, или же как-то сделать подругому запрос. |
fossil
Такая система, которую вы создаёте, обычно называется модульной, и states здесь выступает модулем Есть пару вопросов-предложений: Во-первых, почему вы пишете PHP код:
PHP код:
PHP код:
Ещё замечание к модульной системы, если нету переменной action или эта переменная указывает на не существующий модуль, можно подключать стандартный модуль main (или типа того), который будет являться первой страницей сайта |
Спасибо большое!
|
fossil
еще не плохо бы проверять переменную $st на наличие ../, ./, /root, /etc, и т. д., иначе, конечно получается очень нехорошая штука: Цитата:
|
elfoflorien
Цитата:
|
Vlad Drakula
на счет настроек не знаю (где это настраивается в Linux?), но такое у меня получалось и под Linux, и под Windows |
elfoflorien
В любом случае достаточно проверять, существует ли такой такой файл, на которой указывает переменная $action. Мы же знаем в какой папке лежат все подобные файлы, вот там и смотрим. |
vadimiron
Код:
http://mysite/index.php?action=../../../../../../../etc/passwd или я чего-то не понял? |
elfoflorien
Насчёт такого примера вы правы, но неужели этот файл и вправду вам выдаётся?? В любом случае есть золотое правило: Не доверяем данным, полученным от юзеров-то есть бережённого бог бережёт. Довольно-таки простой выход, это никогда не передавать имена файлов с расширением, то пишем include($action.html) |
Я сделал так, и вродебы все работает:
PHP код:
|
Хотя нет, извеняюсь, баг остается прежним :)
|
PHP код:
|
fossil, vadimiron
как насчет использования метода POST вместо GET? тогда ведь пользователь не сможет так просто подделать имя файла $action; есть, конечно, возможность посмотреть HTML код и послать заголовки и POST, и GET, но все равно пользователь просто так ничего не сделает и не узнает имя переменной, в которой находится путь; потом еще один выход - шифровать содержимое $action, чтобы злоумышленник просто не знал, что туда написать. Можно воспользоваться стандартным алгоритмом PHP, а можно написать свой. |
elfoflorien
Если можешь, пожалуйста про шифрование поподробнее. Можно просто проверять, чтобы нельзя использовать специальные символы, правда я незнаю как. Кто знает напишите плз :) |
2All
есть такая замечательная функция basename. Обрезает путь, возвращая собственно имя файла. После чего приставляем свой настоящий путь до файла и плюем на всех кулхцкеров :). (В случаях, когда нет ветвления по каталогам, или его можно легко предопределить, скажем по тому же имени файла, очень даже помагает). В случае чего можно использовать также dirname, парсить результат и посылать всех, кто пытается выйти за пределы предопределенного дерева каталогов. Насчет $_GET и $_POST - elfoflorien абсолютно прав, - только через предопределенные переменные и желательно через $_POST elfoflorien fossil Шифрование - я бы не стала играть в эти игры :), потому, что следующей после этого проблемой встанет проблема индексирования нашего сайта поисковыми системами |
Время: 19:59. |
Время: 19:59.
© OSzone.net 2001-