Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/16: Рейтинг темы: голосов - 16, средняя оценка - 4.88
 Аватар для pixel
26 / 19 / 5
Регистрация: 19.05.2009
Сообщений: 2,290

Правильно ли я делаю?

12.03.2013, 20:58. Показов 3295. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую.
Я сейчас делаю один макет. Вот код. Подскажите, правильно ли я делаю, или для этого же имеется лучшее решение? И как это с точки зрения безопасности?
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
include("header.php");
$page = $_GET['page'];
if (isset($page))
{
switch ($page)
{
case 1 : 
include("step1.php"); 
break;
case 2 : 
include("step2.php"); 
break;
case 3 : 
include("step3.php"); 
break;
case 4 : 
include("step4.php"); 
break;
case 5 : 
include("step5.php"); 
break;
case 6 : 
include("step6.php"); 
break;
}
}
else      
{
include("step1.php");
}
include("footer.php");
?>
Хочу потом настроить через mod_rewrite, но пока что то в денвере лажа какая то.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.03.2013, 20:58
Ответы с готовыми решениями:

Не работает mail(); все ли я делаю правильно?
Пишу форму обратной связи с капчей, но письмо не отправляется, взгляните свежим взглядом где моя ошибка //...

Правильно ли я реализовываю добавляемые пользователем поля в менеджер контактов. Код есть. Нужен совет, если не правильно делаю
Как я хочу это дело осуществить. Я в класс Contact добавлю какое-то кол-во свойств (BirthDay, FullName, MobilePhoneNumber и т.д.), но я так...

Правильно ли я делаю??
Составьте программу, которая выводит на экран следующий результат (если x+y равно 13): Сумма х и у равна 13 В программе должен...

31
87 / 87 / 8
Регистрация: 02.09.2012
Сообщений: 510
12.03.2013, 21:50
Цитата Сообщение от pixel Посмотреть сообщение
И как это с точки зрения безопасности?
через GET я могу вам подсунуть зловредный файл в котором будет код... не пробовал, но почему бы и нет... даже руки зачесались..
0
 Аватар для pixel
26 / 19 / 5
Регистрация: 19.05.2009
Сообщений: 2,290
12.03.2013, 21:52  [ТС]
и как мне нужно исправить код, что бы такой возможности не было?
0
87 / 87 / 8
Регистрация: 02.09.2012
Сообщений: 510
12.03.2013, 22:00
поменьше гетов.. у вас нормально, вы напрямую не инклюдите файлы... через код(индекс) невозможно впарить свой зловредный пхп код серверу..посмотрел повнимательней.. А условия проверять - как душе угодно, хотите свичем, хотите ифом..
0
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
12.03.2013, 22:20
в плане безопасности нормально все, а сам код можно немного упростить, сделав как-то так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
include("header.php");
$page = isset($_GET['page']) ? $_GET['page'] + 0 : 1;
switch ($page)
{
case 1 : 
include("step1.php"); 
break;
case 2 : 
include("step2.php"); 
break;
case 3 : 
include("step3.php"); 
break;
case 4 : 
include("step4.php"); 
break;
case 5 : 
include("step5.php"); 
break;
case 6 : 
include("step6.php"); 
break;
default:
include('step<какой-то там>.php'); // хотя лучше, наверное, выдавать 404-ую ошибку
}
include("footer.php");
?>
ну или вообще, раз уж привели к инту (для этого и нужен +0, собственно), то можно прямо инклудить 'step'.$page.'.php', если он существует (file_exists), и в противном случае лучше всего, наверное, выдавать 404.
Но это если смотреть только на код. ну а вообще, в представлении определять $_GET['page'] -- не лучшее занятие. опять же, если захотите поменять заголовки ответа (ну да хоть все та же 404ая ошибка), нужно обязательно буферизировать вывод. в принципе, на производительность не влияет, если заранее известно, что шапку нужно вывести всегда и везде, когда управление передается этому файлу. на самом деле, иногда нужен json или xml ответ для какой-то страницы, тогда это будет неудобно. тогда бы не мешало все-таки определиться, какой файл нужен по центру (step1, step2, step3 ну или итд), для чего обработку $_GET вынести раньше, где-то в контроллере.
ну это, на самом деле не всегда так уж и нужно-то.
вот. а еще в вашем коде isset($page) явно лишний. isset должен быть для $_GET['page'] -- вот он может быть не установлен, и будет нотис, если это так. а после $page = $_GET['page'] -- isset($page) всегда будет true.
0
 Аватар для fa2m
356 / 280 / 22
Регистрация: 27.08.2012
Сообщений: 855
12.03.2013, 22:35
не проверял, но вроде должно работать
PHP
1
2
3
4
include 'header.php';
$name_file = 'step'. (isset($_GET['page']) ? $_GET['page'] : 1) .'.php';
file_exists($name_file) ? include $name_file : header("HTTP/1.0 404 Not Found");
include 'footer.php';
идею на счёт 404 взял у NEbo
0
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
12.03.2013, 23:15
fa2m, эх. лучшеб ты у меня взял весь код, а не часть вот теперь есть уязвимость, т.к. нет преобразования в int параметра page. даже если такое не сработает, типа page=/../../../../etc/passwd%00 (количество "../" нужно, конечно, подобрать), то щас вспомню, как...
0
 Аватар для nonamez123
189 / 185 / 54
Регистрация: 23.10.2010
Сообщений: 1,336
12.03.2013, 23:21
Дети, хватит практиковать RFI и LFI. Автор, читай про remote file including.
0
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
12.03.2013, 23:41
ага, экранирование нуль-байта обходится с помощью большого количества слешей (больше 4096 символов при чтении файла обрезаются, захардкодено), а несуществующая "папка" в середине пути роли не играет (таким образом обрезается префикс). короче, уязвимость прекрасно работает.

Не по теме:


nonamez123, рекомендую почитать WASC Threat Classification, и убедиться, что того, что вы называете RFI, в коде нет. впрочем, похвально, что вы знаете эти аббривеатуры

0
 Аватар для fa2m
356 / 280 / 22
Регистрация: 27.08.2012
Сообщений: 855
13.03.2013, 02:06
NEbO, о какой уязвимости Вы говорите? Приведите пример! Что Вы туда "всунете"? какая разница int-не int... Пример, пожалуйста!
0
19 / 17 / 6
Регистрация: 15.11.2011
Сообщений: 133
13.03.2013, 02:10
Думаю лучше делать не get'ы, а посты.
0
 Аватар для fa2m
356 / 280 / 22
Регистрация: 27.08.2012
Сообщений: 855
13.03.2013, 02:14
Цитата Сообщение от Дажьбог Посмотреть сообщение
Думаю лучше делать не get'ы, а посты.
Думаю ТС таким образом просто делает то, для чего другие используют БД ))) пост здесь не подойдёт, пост нужно отправить, а не просто перейти на "другую" страницу. Тем более думаю нужно, чтобы урлы менялись )
0
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
13.03.2013, 12:39
fa2m, ну я ж написал: page=/../../../../etc/passwd%00
в инклуд подставится: include("page/../../../../etc/passwd\000.php"); ну а после нулевого байта должно обрезаться, получится инклуд 'page/../../../../etc/passwd'. Правда, это не всегда срабатывает.
если gpc_magic_quotes=on или на уровне сервера защищается от нуль-байта, или просто не сработало, тогда вариант: page=/../../../../etc/passwd/////////////////////////<еще 4096 слешей или "./"> . Таким образом отрезается суффикс. Разумеется, относительный путь до /etc/passwd еще нужно вычислить, вначале количество "../" нужно подобрать.

Добавлено через 6 минут
а по поводу гет или пост -- без разницы, запрос подделывается одинаково хорошо, что гет что пост. http-запросы вроде как правильнее разделять по смыслу (REST принцип): запрашиваем страницу, значит нужен GET, отправляем смешанные данные -- POST. Отправляем файл (или некоторый ресурс) -- PUT. Отправляем часть ресурса -- PATCH. Удаляем ресурс -- DELETE. Ну и так далее. гугль щедрый на результаты по запросу "http methods", хотя в идеале, желательно заглянуть и в rfc (1945 -- хорошо запоминается и 2616, более актуальный)

Добавлено через 1 минуту
ну и нельзя забывать, что все запросы запросто можно послать вручную, и прислать хоть с помощью того же PUT-а можно что угодно.

Добавлено через 4 минуты
Цитата Сообщение от fa2m Посмотреть сообщение
пост здесь не подойдёт
все подойдет, если там step, значит это какие-то шаги (предполагаю, регистрация или заказ). если это шаги, то наверняка это не "обычные" страницы, которые должны индексироваться. в таком случае, по крайней мере, технически, это можно сделать через форму с
HTML5
1
<input name="page" type="hidden" value="<нужное значение>">
. ну а также, через джаваскрипт
0
 Аватар для fa2m
356 / 280 / 22
Регистрация: 27.08.2012
Сообщений: 855
13.03.2013, 12:47
от .php можно избавиться, но куда Вы денете steppage=/../../../../etc/passwd///////////////////////// в include 'stepВСЁ_ЧТО УГОДНО'; Как Ваша конструкция даст TRUE в file_exist?
0
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
13.03.2013, 13:25
да елки палки. сами посмотрите. $path = '/../aaa.txt'. после конкатенации со 'step' получится: 'step/../aaa.txt'. даже если "каталога" step не существует, файл aaa.txt приинклудится

Добавлено через 16 секунд
и file_exists точно также работает

Добавлено через 9 минут
а вообще, говорят, что эту уязвимость, с 4096 слешами в новых версиях подзакрыли. поэтому если будете повторять на своем сервере, ее может и не быть. точных версий я не нашел, можете погуглить на тему "Path Truncation attack", возможно, вам удастся найти их.
НО! в любом случае, присутствует information disclosure, вы в ЛЮБОМ случае, хоть на самых новых серверах, по крайней мере проверить наличие/отсуствие php файла в любой директории (выдача 404ой ошибки или ее отсутсвие). ну а если на сервере еще и include_path установлен в какое-то интересное значение, то у вас появится еще куда больше возможностей.
да блин, что я объясняю. три раза сказал, надеюсь, кому нужно, тот услышал.
пс. и инклудить лучше по полному пути файла: меньше потенциальных проблем с безопасностью, ну и не нужно обходить include_path (тем более что в нем может и не быть каталога '.').
1
 Аватар для fa2m
356 / 280 / 22
Регистрация: 27.08.2012
Сообщений: 855
13.03.2013, 14:11
В общем я Вас понял, Вы хотели сказать, что: при совпадении с ещё какими-то ситуациями данный скрипт может быть не безопасен (потенциально опасным).
Но сам по себе - он не опасен.
0
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
13.03.2013, 14:25
ну так если нам нужно лишь имя файла , а не путь , так берем только имя
PHP
1
echo pathinfo('../../../test' , PATHINFO_FILENAME );
0
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
13.03.2013, 14:28

Не по теме:

Цитата Сообщение от fa2m Посмотреть сообщение
при совпадении с ещё какими-то ситуациями
точно, вы правы. на сервере должен стоять интерпретатор пхп, иначе уязвимость не заработает, вы верно подметили!



Добавлено через 1 минуту
блин, ну нафига? если можно просто привести к инту, если там только цифры? а для
Цитата Сообщение от crautcher Посмотреть сообщение
если нам нужно лишь имя файла
чаще пользуются basename(), насколько мне известно
0
 Аватар для fa2m
356 / 280 / 22
Регистрация: 27.08.2012
Сообщений: 855
13.03.2013, 14:40
Цитата Сообщение от NEbO Посмотреть сообщение
точно, вы правы. на сервере должен стоять интерпретатор пхп, иначе уязвимость не заработает, вы верно подметили!
Ценю Ваш юмор, но проблема в том, что file_exist работает не так, как include и в нём запись step/../../file.php не сработает
0
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
13.03.2013, 15:29
и да. при некоторых обстоятельствах указанная уязвимость не является критической. ну что-то из разряда "ага, топлива у нас на посадку не хватит, но мы все рассчитали: спустим ракету на землю на веревочке".
я понимаю, что троллить -- это очень весело, но если честно,я не понимаю, зачем допускать намеренно ошибки в коде, под предлогом помощи. считайте, что вы добились своего, вы меня выбесили, честно.
также, и вам рекомендую посмотреть классификацию WASC, там очень прикольно , во второй версии разделили на атаки и уязвимости. в вашем коде есть уязвимость, а уж каким боком она будет к конкретной атаке -- один черт знает. может там вообще эти несколько скриптов в одтельном jail-е, полностью защищенном работают? ну тогда да, атаковать проблематично, если не вскроются специфические для данной версии пхп баги. ну а если сам пхп запускается с правами какого-нибудь там непойми-кого, и имеет доступ опять же только к этой папке? тем более, атаковать еще сложнее, даже если найдете buffer overflow, и у вас есть полный доступ на чтение, запись и исполнение этой папки. хорошо это или нет? да замечательно просто, лучше не придумаешь. и правда, уязвимость не критическая. и eval($_GET['cmd']) в таком случае, тоже.
я не хакер. хоть я при проводил пару xss-атак, несколько раз ломал сервера наглых и подлых людей, но я не знаю ни всех принципов, не всегда смогу "раскрутить" такую уязвимость. не знаю даже процент тех серверов, на котором атака на нее сейчас пройдет. я лишь не думаю, что это 1-2%, ибо на серверах предпочитают, как правило, более старые, "стабильные" версии, особенно это касается шаред-хостинга.
я всего лишь знаю один принцип: чем меньше уязвимостей, тем лучше.
я могу показать, как примерно организовать атаку на эту уязвимость, а дальше -- это уже дело хакера, как он будет атаковать. Знаю лишь, что в паблике на эту тему почти никто никогда ничего не освещает, и вы с такой уязвимостью будете защищены от 95% (скажем) хакеров. для сайта Васи Петечкина, или для сайта-визитки компании УстьУрюпинскСпичкиТорг все будет в шоколаде, если там по 20-30 человек в день планируется, да хрен бы с ним!
Условий можно придумать миллионы. Но тут вроде как обучающий раздел, вроде человек спрашивает про уязвимости. Ладно, если бы ваш код был единственный, это было бы на вашей совести, все забыли и проехали. Но зачем путать, есть уязвимость или нет, если она есть? это атаки может не найтись, при некоторых условиях. Я уже привел несколько примеров, как ее можно провести.

Добавлено через 2 минуты
Цитата Сообщение от fa2m Посмотреть сообщение
Ценю Ваш юмор, но проблема в том, что file_exist работает не так, как include и в нём запись step/../../file.php не сработает
и еще раз блин. проверяйте сами что вы пишите. если я уже 3 раза сказал одно и то же, значит что это работает:
Code
1
2
c:\Temp>php -r "var_dump(file_exists('hdsafguyaeyufweg12341Ssgdx/../../1.c'));"
bool(true)
на диске c:/1.c есть, а вот каталога hdsafguyaeyufweg12341Ssgdx в папке c:/Temp нет

Добавлено через 8 минут
пс. ну да, с джейлом я погорячился немного, хватит и простого open_basedir
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.03.2013, 15:29
Помогаю со студенческими работами здесь

Правильно ли я делаю?
Создал БД abc в ней создал таблицу test, теперь я хочу с помощью sql запрос вывести все данные находящиеся в данной таблице, написал вот...

Правильно ли я делаю
Дана матрица,выяснить явл ли она еденичной if ((i=j) &amp;&amp; (m&lt;&gt;1)) || ((i&lt;&gt;j) &amp;&amp;(m&lt;&gt;0))

Git правильно ли я делаю
Всем привет. С гитом совсем не могу подружится. Научился только свои проекты (если делаю один) пушить изменения. НО если над проектом...

Всё ли я правильно делаю ?
Сегодня, считай, первый день как начал изучать С++. В качестве компиляции использую Microsoft Visual C++ 2010 Express. И хочу узнать Ваше...

Что я делаю не правильно ?!
Выраз программы: Program s7; uses crt; const a=6.45; var f,x,y,e,Pi: real; begin clrscr; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru