|
|
|
| Здраствуйте!
Посмотрите, пожалуйста, на эти примеры.
Есть ли в их написании принципиальная разница? При корректной передаче формы разницы нет, оба кода работают:
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 символов) и, соответсвенно, скрипт не завершится ошибкой, а продолжит выполняться.
Если это утверждение верно, то второму скрипту всё это не грозит.
Верно ли я всё изложил, если нет, выскажитесь, пожалуйста, | |
|
|
|
|
|
|
|
для: sp10
(06.04.2008 в 22:51)
| | если isset($_POST['first_name']) вернет false , то второе условие даже не будет проверяться (логическое И проверяется до первого ложного условия, дальше проверять бессмысленно, все равно в результате будет ложь) | |
|
|
|
|
|
|
|
для: 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-ом? | |
|
|
|
|
|
|
|
для: sp10
(07.04.2008 в 11:05)
| |
<?php
if (isset($_POST['first_name'])
if (strlen(trim($_POST['first_name'])) <=5 )) {
print 'Имя должно содержать больше 5 символов.';
} else {
echo 'Привет,' . $_POST['first_name'] . '!';
}
?>
|
правильнее будет так наверное. | |
|
|
|
|
|
|
|
для: HaJIuBauKa
(07.04.2008 в 11:21)
| | а что изменилось?
если первый иф ложный, второй даже не будет проверяться. И вообще чепуха получается, он никаких сообщений не выдаст, просто код обойдется и все.
Что то не там копаете, что именно смущает, что поприветствуете хакера? В данном случае, как не переставляйте, если хакер пришлет first_name, вы его и воспримите. | |
|
|
|