|
|
|
| У меня есть форма регистрации, там много полей, но я приведу в пример обработку только одного...
Итак, в эту форму пользователь вводить регистрационную информацию, которая затем передаётся в обработчик методом 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", то это уже что-то значит, ведь так? Какой бы код не ввели - она всё преобразует в обычный текст? | |
|
|
|
|
|
|
|
для: 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), как правило дыры появляются из-за невнимательности :). | |
|
|
|
|
|
|
|
для: cheops
(27.02.2005 в 21:38)
| | Что-то я не понял... А как тогда нужно писать код? Чтобы работало всё, а не только "addslashes"?
И ещё кстате, вопрос по старой теме... Насчёт изменения информации? Какой именно следут запрос посылать в БД? Я уже мног чего перепробовал, производит регистрацию, а не обновление => Пишет, что такой пользователь уже есть... | |
|
|
|
|
|
|
|
для: 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);
?>
|
т.е. организовать код таким образом, чтобы меры защиты накапливались... | |
|
|
|
|
|
|
|
для: cheops
(27.02.2005 в 23:05)
| | Написал код как Вы сказали, включил файл с кодом в страницу где всё должно обрабатываться... И ничего не проверяется... В поле $uid - Имя пользователя стоит ограничение 10 символов. Я ввожу 20 и пропускает! :(
В чём дело? | |
|
|
|
|
|
|
|
для: evgen_17
(28.02.2005 в 21:25)
| | А данный код и не ограничивает число символов - он просто берёт первые 10 из введённых - или и в базу попадает 20? | |
|
|
|
|
|
|
|
для: cheops
(28.02.2005 в 22:16)
| | С этим вроде разобрался...
Использовал
<? if (!ctype_alnum($u) || strlen($u) < 4 || 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"; } ?>
|
всё равно позволяет ввести код скрипта после знака ";"... как от этого защититься? | |
|
|
|
|
|
|
|
для: evgen_17
(28.02.2005 в 23:11)
| |
<?
if (!ctype_alnum($u) || strlen($u) < 4 || strlen($u) > 10) {
echo "<font color=red>Логин должен содержать от 4 до 10 символов. (буквы и цифры)</font><br>";
$err = "yes";
}
?>
|
Мне кажется вместо переменной лучше воспользоватся константой. Так безопаснее.
Но может я ошибаюсь. | |
|
|
|
|
|
|
|
для: Atom
(28.02.2005 в 23:55)
| | Как же я воспользуюсь константой, если то, что должно быть короче 10 и длиннее 4 символов напрямую зависит от того, что введёт пользователь? | |
|
|
|
|
|
|
|
для: evgen_17
(27.02.2005 в 22:18)
| | По SQL-запросу лучше организовать отдельную тему в http://www.softtime.ru/forum/index.php?id_forum=3, с воспроизведением ситуации, иначе посетителям, которые не читали тему будет трудно участвовать в дискуссии, да и те кто читал уже вряд ли запросто легко смогут её найти. | |
|
|
|
|
|
|
|
для: cheops
(27.02.2005 в 23:08)
| | тоже недавно работал с этой темой.. и все вроде ничего да вот только решил я проверить насколько "чисто" чистеится отправленное содержимое... открыл блокнотом код той же страницы тупо скопировал его в форму и нажал "отправить".... произошло следующее: ничего не отправилось лишь в левом нижнем углу браузера возник восклицательный знак что свидетильствовало о наличии ошибки.... чего там написали щас не припомню.. но произхошло все это скорее всего из-за ява скрипта присутствующего в коде страницы (один проверял заполнены ли необходимые поля формыторой - навигационное меню).
Так вот назрел вотпрос... можно ли написать код который бы сработал в момент отправки а не в момент уже последующей обработки? | |
|
|
|
|
|
|
|
для: cheops
(27.02.2005 в 23:08)
| |
<?
if (!ctype_alnum($u) || strlen($u) < 4 || strlen($u) > 10) {
echo "<font color=red>Логин должен содержать от 4 до 10 символов. (буквы и цифры)</font><br>";
$err = "yes";
}
?>
|
Разрешает вводить Логин только на английском иначе ничего в БД не заносится. Почему??? | |
|
|
|
|
|
|
|
для: evgen_17
(02.03.2005 в 20:53)
| | Функция ctype_alnum() возвращает true, если строка $u содержит только цифры и буквы английского алфавита и false - если это не так. Эта функция соответствует следующему регулярному выражению
<?php
preg_match('/^[a-z0-9]*$/i', $u);
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(02.03.2005 в 23:23)
| | Значит чтобы можно было использовать русские буквы нужно что0то другое придумать? Но как это заменить? Функция то хорошо работает... | |
|
|
|
|
|
|
|
для: evgen_17
(02.03.2005 в 23:26)
| | Подходящее регулярное выражение описывается по теме http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=834 | |
|
|
|
|
|
|
|
для: 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... Что тут не так? | |
|
|
|
|
|
|
|
для: evgen_17
(03.03.2005 в 00:05)
| | Хм... а у меня этот пример нормально отрабатывает. | |
|
|
|