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

Форум PHP

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

 

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

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

тема: Корректный скрипт для проверки формы
 
 автор: sp10   (06.04.2008 в 22:51)   письмо автору
 
 

Здраствуйте!
Посмотрите, пожалуйста, на эти примеры.
Есть ли в их написании принципиальная разница? При корректной передаче формы разницы нет, оба кода работают:

1.
if (isset($_POST['first_name']) && (strlen(trim($_POST['first_name'])) <=5 )) {
   print 'Имя должно содержать больше 5 символов.';
} else {
  echo 'Привет,' . $_POST['first_name'] . '!';
}


2.
if (! (isset($_POST['first_name']) && (strlen(trim($_POST['first_name'])) >=5 ))) {
   print 'Имя должно содержать больше 5 символов.';
} else {
  echo 'Привет,' . $_POST['first_name'] . '!';
}

Примеры взяты из книги «РНР. Рецепты программирования». Причем авторы используют обе формы кода (функцию trim() я от себя добавил). На первый взгляд, оба кода работают правильно и как написать зависит от желания программиста.
Но дело в том, что там же авторы объясняют, что перед тем, как проверять корректность заполнения поля (заполнено ли оно, сколько там символов и т.д.), функцией isset() нужно удостовериться, что этот элемент существует именно в массиве $_POST, т.к. запрос может прийти не от браузера, а от строящего вручную запросы хакера, вооруживщегося НТТР-спецификацией и telnet-клиентом.
Вот тут-то и проблема. Сейчас я скажу свои выводы человека, не разбирающегося в telnet, а тех, кто в теме, очень прошу высказаться по этому поводу.
Если следовать утверждениям авторов, то первый код ошибочен, т.к. даже если элемента нет в $_POST ( isset($_POST['first_name']) вернет false ), велика вероятность того, что хакер может послать через telnet методом POST данные, которые будут удовлетворять условию проверки (не меньше 5 символов) и, соответсвенно, скрипт не завершится ошибкой, а продолжит выполняться.
Если это утверждение верно, то второму скрипту всё это не грозит.
Верно ли я всё изложил, если нет, выскажитесь, пожалуйста,

   
 
 автор: GeorgeIV   (07.04.2008 в 10:32)   письмо автору
 
   для: sp10   (06.04.2008 в 22:51)
 

если isset($_POST['first_name']) вернет false , то второе условие даже не будет проверяться (логическое И проверяется до первого ложного условия, дальше проверять бессмысленно, все равно в результате будет ложь)

   
 
 автор: sp10   (07.04.2008 в 11:05)   письмо автору
 
   для: GeorgeIV   (07.04.2008 в 10:32)
 

Я и говорю.
В таком случае первый код, вот этот, ошибочен, т.к. не будет выведено сообщение об ошибке, а выведется приветствие, если хакер с telnet-ом прислал методом POST такую переменную.

if (isset($_POST['first_name']) && (strlen(trim($_POST['first_name'])) <=5 )) {
   print 'Имя должно содержать больше 5 символов.';
} else {
  echo 'Привет,' . $_POST['first_name'] . '!';
}


Или я что-то путаю с telnet-ом?

   
 
 автор: HaJIuBauKa   (07.04.2008 в 11:21)   письмо автору
 
   для: sp10   (07.04.2008 в 11:05)
 

<?php
if (isset($_POST['first_name']) 
 if (
strlen(trim($_POST['first_name'])) <=)) {
   print 
'Имя должно содержать больше 5 символов.';
} else {
  echo 
'Привет,' $_POST['first_name'] . '!';
}
?>


правильнее будет так наверное.

   
 
 автор: GeorgeIV   (07.04.2008 в 11:34)   письмо автору
 
   для: HaJIuBauKa   (07.04.2008 в 11:21)
 

а что изменилось?
если первый иф ложный, второй даже не будет проверяться. И вообще чепуха получается, он никаких сообщений не выдаст, просто код обойдется и все.
Что то не там копаете, что именно смущает, что поприветствуете хакера? В данном случае, как не переставляйте, если хакер пришлет first_name, вы его и воспримите.

   
Rambler's Top100
вверх

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