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

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

12.03.2013, 20:58. Показов 3519. Ответов 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
 Аватар для fa2m
356 / 280 / 22
Регистрация: 27.08.2012
Сообщений: 855
13.03.2013, 15:34
Студворк — интернет-сервис помощи студентам
Только что проверил ещё раз file_exist, в первый раз я ошибся "я был не прав, но ты меня прости" (с)
P.S. С Вами приятно вести дискуссию!

Добавлено через 4 минуты
Уязвимость слабая, но она есть, поэтому считаю свой код написанным не по фен-шую
2
 Аватар для pixel
26 / 19 / 5
Регистрация: 19.05.2009
Сообщений: 2,309
13.03.2013, 16:29  [ТС]

Не по теме:

Мдя, вроде идиотский вопрос задал, а дискуссия разрослась на 3 страницы. Это радует. Значит не настолько уж и идиотский вопрос. :-)


Цитата Сообщение от NEbO Посмотреть сообщение
все подойдет, если там step, значит это какие-то шаги (предполагаю, регистрация или заказ). если это шаги, то наверняка это не "обычные" страницы, которые должны индексироваться.
честно говоря, это обычные страницы - даже не динамика. Просто маленький статик-сайтик, а БД из за малого количества данных, да и из за любителей поломиться в админку заводить не хочется. а stepX - это чисто для примера.
Цитата Сообщение от fa2m Посмотреть сообщение
не проверял, но вроде должно работать
PHP
1
2
$name_file = 'step'. (isset($_GET['page']) ? $_GET['page'] : 1) .'.php';
file_exists($name_file) ? include $name_file : header("HTTP/1.0 404 Not Found");
подскажите, а что это за ? и : (и что за 1 после ? Просто делал по-старинке, с такими конструкциями не работал никогда. И перед file_exists не требуется if?
0
 Аватар для fa2m
356 / 280 / 22
Регистрация: 27.08.2012
Сообщений: 855
13.03.2013, 17:01
Я думаю эта ссылка поможет http://www.fortress-design.com... ct-syntax/
1
508 / 358 / 13
Регистрация: 12.03.2012
Сообщений: 1,896
13.03.2013, 17:04
Цитата Сообщение от Дажьбог Посмотреть сообщение
Думаю лучше делать не get'ы, а посты.
Посты - плохо, во время постов нельзя развлекаться и бухать.

Ответы в теме - мрак.
0
 Аватар для pixel
26 / 19 / 5
Регистрация: 19.05.2009
Сообщений: 2,309
13.03.2013, 17:40  [ТС]
т.е. правильно ли я понимаю, что в моем случае нужно:
1. проверять переменную $_GET['page'] на предмет числового значения
2. проверять существование файла типа step.$_GET['page'].php
данные шаги сделают безопасным код?
0
 Аватар для fa2m
356 / 280 / 22
Регистрация: 27.08.2012
Сообщений: 855
13.03.2013, 17:45
должны сделать, но не знаю как Вы там его напишите
0
 Аватар для pixel
26 / 19 / 5
Регистрация: 19.05.2009
Сообщений: 2,309
13.03.2013, 17:49  [ТС]
так я напишу и покажу. а вы посмотрите.
0
508 / 358 / 13
Регистрация: 12.03.2012
Сообщений: 1,896
13.03.2013, 18:23
Цитата Сообщение от pixel Посмотреть сообщение
проверять существование файла типа step.$_GET['page'].php
Надо иметь белый список допустимых значений. В случае несоответствия отдавать 404.
0
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
13.03.2013, 19:52
входным переменным доверять нельзя. вообще. даже того, что было предложено выше, basename, вроде как, по идее, хватает. но лично я когда делаю такие вещи, думаю немного по другому: а что вообще я ожидаю увидеть в этой переменной? разве я хочу, чтобы у меня были страницы типа "%78$!!gg~<purum>" ?? нет, мне нужны только буковки, циферки, знак подчеркивания, тире. и у меня получается простая проверка:
PHP
1
2
3
4
5
if (preg_match('@[^\pL0-9\-_]@S')) { 
  // в переменной есть недопустимые символы. значит тут был хакер, или я на какой-то странице дал неверную ссылку. 
} else {
  // загружаем, показываем страницу
}
и отпадает необходимость следить за тем, что вернет basename от необычных аргументов, и мне в этом каталоге всегда можно расположить какой-нибудь файл, содержащий недопустимый символ, для тестирования, например.
также, следует проверить переменную по длине, на всякий случай. особенно, при пост запросе -- не будет же имя файла длиной 8 мегабайт (зависит, разумеется, от настроек php), и если длина, скажем, больше 256 символов (ну или сколько там может быть, в конкретном проекте), то какой смысл запускать эту регулярку на 8ми метровых данных? так и задосить (именно DoS, а не DDoS даже) недолго. а длина строки в zval идет в отдельном поле, т.е. примерно как в делфях, и, по идее, должна вычисляться за константное время (поле-то предусмотрено, но о криворукости разработчиков пхп ходят легенды... не уверен, что strlen всегда, на всех версиях, работает именно так, но я очень на это надеюсь благо, проверить можно). таким образом, хотябы в этом месте, вы можете заранее составить алгоритм, обрабатывающий не более чем N символов, где N задаете вы, а не хакер
pixel, в вашем первоначальном коде входной параметр не используется непосредственно. это один из самых надежных способов защиты, правда, это происходит в ущерб гибкости: чтобы добавить новый файл, вам недостаточно просто поместить его в каталог, вам нужно еще и добавить его в этот switch.
правда, сразу что-то не заметил, в case-ах у вас int-ы, а $page всегда будет строкой или массивом строк (все $_GET параметры имеют такой тип). но это уже вопрос производительности (php "очень крут" в плане автоматического преобразования типов), для 7ми вариантов, пожалуй, не очень-то и критично, но все же правильней либо $page преобразовать в int, либо под case-ами указывать не 1, 2, 3, ..., а '1', '2', '3', ... в моем коде $page в инт уже преобразован, так что все нормально. Еще, есть замечательная статья, PHP: a Fractal of Bad Design и ее перевод. Рекомендую ее к прочтению абсолютно всем пхп-разработчикам, в первую очередь для того, чтобы узнать об особенностях этого языка. В частности, там освещены вопросы преобразования типов, хоть и не полностью.

Далее, что касается file_exists('<какой-то каталог>/<еще какой-то каталог>/<...>/../../../../../<...>/file.php').
Представьте на секунду, что функция вернула бы false. Почему? потому что промежуточный каталог <какой-то каталог> не существует? В таком случае, как должна работать эта функция? Правильно, она должна делить всю строку по слешам, должна к каждому файлу применять ф-цию is_dir()... сами подумайте, разве это не долго? Ну ладно бы, просто долго. А представьте, что вы применяете полные пути к файлам: /var/www/mysite/htdocs/dir1/dir2/index.php . Думаете, при каждом таком инклуде или file_exists должны проверяться все промежуточные каталоги? Да это ж капец как долго, на самом деле! То есть получится, что использовать include_path во много раз быстрее, хотя мы указали: да вот на, не мучайся, не ищи ты этот файл! Он должен быть точно вот тут! А он начинает шариться по каталогам... ужас. разве нет?
Я не эксперт в области файловых систем, но не думаю, что есть какой-то иной способ сохранять имя файла, кроме как в единственном, уникальном, каноническом виде: в виде абсолютного пути, которое должно быть уникальным.

Не по теме:

Разумеется, к этому всему нужно как-то приплести иноды и прочую радость внутреннего устройства ФС. Я подумал, порассуждал, но я правда не смог сходу придумать, как это реально и очень производительно реализуется. Поэтому этот аспект я не стану затрагивать, и далее рассуждения идут очень абстрактно. Но по крайней мере, это применимо ко всем ФС, которые я знаю

. Это уникальное имя есть его абсолютный путь. Преобразовать из относительного в абсолютный, зная текущий каталог, нетрудно. Для этого вырезаются лишние точки, слеши, "../" вырезают из строки предыдущую часть, ну и так далее.

Не по теме:

Я не уверен на 100%, что так делается на низком уровне и всегда. Ведь читая входную строку, содержащую имя файла, теоретически можно двигаться и по дереву ФС, и тогда, в действительности, можно обнаружить, что какого-то промежуточного каталога нет. надо будет как-нибудь это проверить (ну долго и ооочень влом запустить блокнот и сделать fopen, это да:), но все же я пишу не про файловые системы в общем), но, по крайней мере, это справедливо для php (в тех же мануалах по lfi можно прочитать, где и как выполняется это преобразование. Хакерам все это еще лучше надо знать, чем простым разработчикам:))

И после преобразования в этот "канонический" вид, остается просто абсолютное имя файла. А вот его-то пхп и передает операционке -- пусть читает. И оказывается, что все эти промежуточные каталоги просто исчезли. И такое преобразование выполняется для всех операций с файлами.

Добавлено через 29 минут
Цитата Сообщение от pixel Посмотреть сообщение
подскажите, а что это за ? и : ( и что за 1 после ? )

Не по теме:

черт. раздел для начинающих. точно. блин. я думал, это скромность такая, задавать вопросы по безопасности... зря ты, Сережа, сюда, пришел, ой как зря... моск вынес всем...


*pokerface* это Тернарная условная операция. или, в народе, просто, тернарный оператор. Тернарный -- от слова "тройной", т.е. три операнда. обычно их два, как a+b, или a-b, или a<<b, или a|b, ну и т.д. а тут вот их три. ну собственно, обычно, в языках программирования (по крайней мере, императивных) их не очень много, поэтому единственным тернарным оператором является эта вот хренотенька. Поэтому под словосочетанием "тернарный оператор" по дефолту понимается "условный тернарный оператор".
0
13.03.2013, 20:01

Не по теме:

Цитата Сообщение от NEbO Посмотреть сообщение
это Тернарная условная операция. или, в народе, просто, тернарный оператор. Тернарный -- от слова "тройной", т.е. три операнда. обычно их два, как a+b, или a-b, или a<<b, или a|b, ну и т.д. а тут вот их три. ну собственно, обычно, в языках программирования (по крайней мере, императивных) их не очень много, поэтому единственным тернарным оператором является эта вот хренотенька. Поэтому под словосочетанием "тернарный оператор" по дефолту понимается "условный тернарный оператор".
переспамлеnность ключевым словом detected

0
13.03.2013, 20:12

Не по теме:

:D забыл еще пару ссылок, ага. сеошники нервно курят в сторонке: я наконец-то придумал, как раскрутить википедию!

0
 Аватар для pixel
26 / 19 / 5
Регистрация: 19.05.2009
Сообщений: 2,309
19.03.2013, 17:09  [ТС]
вот если вместо switch сделать так:
PHP
1
2
$file_name = 'step'. (preg_match("|^[\d]+$|", $_GET['page']) ? $_GET['page'] : 1) .'.php';
file_exists($file_name) ? include $file_name : include ("step1.php");
это безопасно? (с хидером делать не стал т.к. пишет что хидер уже послан)

Добавлено через 56 минут
С хидером сделал, но выдает пустой экран так и должно быть?
PHP
1
2
3
4
5
6
7
8
9
function Loader($fn)
{
include("header.php"); 
include $fn; 
include("footer.php");
}
 
$file_name = 'step'. (preg_match("|^[\d]+$|", $_GET['page']) ? $_GET['page'] : 1) .'.php';
file_exists($file_name) ? Loader($file_name) :  header("HTTP/1.0 404 Not Found");
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.03.2013, 17:09

Правильно ли я делаю?
Создал БД 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; ...


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru