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

Форум PHP

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

 

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

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

тема: Комбинирование функций защиты
 
 автор: evgen_17   (27.02.2005 в 21:34)   письмо автору
 
 

У меня есть форма регистрации, там много полей, но я приведу в пример обработку только одного...
Итак, в эту форму пользователь вводить регистрационную информацию, которая затем передаётся в обработчик методом POST.
Если в обработчик включить или прямо в нём написать (кстате, как лучше?) код следующего содержания:

<?
$uid 
substr($_POST["uid"],0,10);   
$uid str_replace("'","'",$_POST['uid'] );
$uid htmlspecialchars(stripslashes($_POST['uid']));
$uid preg_replace("/[a-z0-9]/i""",$_POST['uid'] );
$uid trim($_POST['uid'] );
$uid strip_tags($_POST['uid'] );
                            
if (!
get_magic_quotes_gpc()) 

        
$uid=mysql_escape_string($_POST['uid']); 
}
$uid addslashes($_POST['uid']); 
?>

(Та же проверка для всех остальных переменных...)
, то что Вы скажите? Насколько это надёжный способ защиты? Кстате, если используется "htmlspecialchars", то это уже что-то значит, ведь так? Какой бы код не ввели - она всё преобразует в обычный текст?

   
 
 автор: cheops   (27.02.2005 в 21:38)   письмо автору
 
   для: evgen_17   (27.02.2005 в 21:34)
 

>Если в обработчик включить или прямо в нём написать (кстате, как лучше?)
1) Лучше разделять форму и обработчик - код будет проще, поэтому при создании и модифицировании вероятность сделать ляп будет меньше.
>, то что Вы скажите?
2) Лучше убрать замену обратных кавычек - это действие лишнее
3) Не очень понятно, что делает эта строка
<?php 
  $uid 
preg_replace("/[a-z0-9]/i""",$_POST['uid'] ); 
?>

Нужны только спец-символы?
4) Этот код, тоже по-моему лишний
<?php 
$uid 
strip_tags($_POST['uid'] ); 
?>

>Какой бы код не ввели - она всё преобразует в обычный текст?
Нет она только заменит HTML-код на его эквиваленты, но этого достаточно.
5) На самом деле вы зря беспокоитесь, так как у вас ввод ограничен 10 символами, то у злоумышленика нет практически никаких шансов написать какой-бы то нибыло код.
6) Плохо вот что, вы в каждой строке переопределяете переменную $uid, так как вместо того, чтобы использовать $uid в качестве параметра у вас везде $_POST['uid']. Поэтому реально вся защита состоит из
<?php 
  $uid 
addslashes($_POST['uid']); 
?>

PS Больше внимания следует уделять именно таким вещам (6), как правило дыры появляются из-за невнимательности :).

   
 
 автор: evgen_17   (27.02.2005 в 22:18)   письмо автору
 
   для: cheops   (27.02.2005 в 21:38)
 

Что-то я не понял... А как тогда нужно писать код? Чтобы работало всё, а не только "addslashes"?
И ещё кстате, вопрос по старой теме... Насчёт изменения информации? Какой именно следут запрос посылать в БД? Я уже мног чего перепробовал, производит регистрацию, а не обновление => Пишет, что такой пользователь уже есть...

   
 
 автор: cheops   (27.02.2005 в 23:05)   письмо автору
 
   для: evgen_17   (27.02.2005 в 22:18)
 

<?
$uid 
substr($_POST["uid"],0,10);   
$uid str_replace("'","'",$uid);
$uid htmlspecialchars(stripslashes($uid));
$uid preg_replace("/[a-z0-9]/i""",$uid);
$uid trim($uid);
$uid strip_tags($uid);
if (!
get_magic_quotes_gpc()) 

        
$uid=mysql_escape_string($uid); 
}
$uid addslashes($uid); 
?>

т.е. организовать код таким образом, чтобы меры защиты накапливались...

   
 
 автор: evgen_17   (28.02.2005 в 21:25)   письмо автору
 
   для: cheops   (27.02.2005 в 23:05)
 

Написал код как Вы сказали, включил файл с кодом в страницу где всё должно обрабатываться... И ничего не проверяется... В поле $uid - Имя пользователя стоит ограничение 10 символов. Я ввожу 20 и пропускает! :(
В чём дело?

   
 
 автор: cheops   (28.02.2005 в 22:16)   письмо автору
 
   для: evgen_17   (28.02.2005 в 21:25)
 

А данный код и не ограничивает число символов - он просто берёт первые 10 из введённых - или и в базу попадает 20?

   
 
 автор: evgen_17   (28.02.2005 в 23:11)   письмо автору
 
   для: cheops   (28.02.2005 в 22:16)
 

С этим вроде разобрался...
Использовал

<?
if (!ctype_alnum($u) || strlen($u) < || strlen($u) > 10) {
            echo 
"<font color=red>Логин должен содержать от 4 до 10 символов. (буквы и цифры)</font><br>";
            
$err "yes";
}   
?>

Можно узнать как использовать регулярное выражение preg_macth? Например мне нужно чтобы можно было ипользовать русские и английские буквы верхнего и нижнего регистра, знак подчёркивания, тире и цыфры...
И кстате использование такого ограничения на ввод e-mail

<?
if (!preg_match("/^[-0-9a-z_]+@[-0-9a-z_^\.]+\.[a-z]{2,3}$/i"$email)) 

 echo 
"<font color=red>Поле E-mail должно содержать запись вида mail@mail.ru"

?>

всё равно позволяет ввести код скрипта после знака ";"... как от этого защититься?

   
 
 автор: Atom   (28.02.2005 в 23:55)   письмо автору
 
   для: evgen_17   (28.02.2005 в 23:11)
 


<?
if (!ctype_alnum($u) || strlen($u) < || strlen($u) > 10) {
            echo 
"<font color=red>Логин должен содержать от 4 до 10 символов. (буквы и цифры)</font><br>";
            
$err "yes";
}   
?>

Мне кажется вместо переменной лучше воспользоватся константой. Так безопаснее.
Но может я ошибаюсь.

   
 
 автор: evgen_17   (01.03.2005 в 19:34)   письмо автору
 
   для: Atom   (28.02.2005 в 23:55)
 

Как же я воспользуюсь константой, если то, что должно быть короче 10 и длиннее 4 символов напрямую зависит от того, что введёт пользователь?

   
 
 автор: cheops   (27.02.2005 в 23:08)   письмо автору
 
   для: evgen_17   (27.02.2005 в 22:18)
 

По SQL-запросу лучше организовать отдельную тему в http://www.softtime.ru/forum/index.php?id_forum=3, с воспроизведением ситуации, иначе посетителям, которые не читали тему будет трудно участвовать в дискуссии, да и те кто читал уже вряд ли запросто легко смогут её найти.

   
 
 автор: localGhost   (28.02.2005 в 03:39)   письмо автору
 
   для: cheops   (27.02.2005 в 23:08)
 

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

Так вот назрел вотпрос... можно ли написать код который бы сработал в момент отправки а не в момент уже последующей обработки?

   
 
 автор: evgen_17   (02.03.2005 в 20:53)   письмо автору
 
   для: cheops   (27.02.2005 в 23:08)
 


<? 
if (!ctype_alnum($u) || strlen($u) < || strlen($u) > 10) { 
            echo 
"<font color=red>Логин должен содержать от 4 до 10 символов. (буквы и цифры)</font><br>"
            
$err "yes"
}    
?>

Разрешает вводить Логин только на английском иначе ничего в БД не заносится. Почему???

   
 
 автор: cheops   (02.03.2005 в 23:23)   письмо автору
 
   для: evgen_17   (02.03.2005 в 20:53)
 

Функция ctype_alnum() возвращает true, если строка $u содержит только цифры и буквы английского алфавита и false - если это не так. Эта функция соответствует следующему регулярному выражению
<?php
  preg_match
('/^[a-z0-9]*$/i'$u);
?>

   
 
 автор: evgen_17   (02.03.2005 в 23:26)   письмо автору
 
   для: cheops   (02.03.2005 в 23:23)
 

Значит чтобы можно было использовать русские буквы нужно что0то другое придумать? Но как это заменить? Функция то хорошо работает...

   
 
 автор: cheops   (02.03.2005 в 23:34)   письмо автору
 
   для: evgen_17   (02.03.2005 в 23:26)
 

Подходящее регулярное выражение описывается по теме http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=834

   
 
 автор: evgen_17   (03.03.2005 в 00:05)   письмо автору
 
   для: cheops   (02.03.2005 в 23:34)
 

Пмшу:

$div = "Только-указанные-символы";
$uid = "|^[-_а-яa-z0-9]+$|i"; 
if(!preg_match($uid, $div)) 

echo "<table><tr><td><font color=red>Неверный ввод!</font><br></td></tr></table>";
            $err = "yes";


$uid = Логин. Я пишу "Имя_Пользователя" в поле "Логин" А мне выдаётся сообщение "Неверный ввод!" И в поле "Логин" вставляется |^[-_а-яa-z0-9]+$|i... Что тут не так?

   
 
 автор: cheops   (03.03.2005 в 07:04)   письмо автору
 
   для: evgen_17   (03.03.2005 в 00:05)
 

Хм... а у меня этот пример нормально отрабатывает.

   
Rambler's Top100
вверх

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