|
|
|
| Здравствуйте
прочитал тут вот эту статейку и задумался....
http://old.antichat.ru/sql/
был у меня такой запрос: (в одинарных кавычках)
$query = mysql_query("SELECT pass FROM users WHERE name='".$_POST['Username']."'");
|
преобразовал в вот в такой вот:
$query = mysql_query("SELECT pass FROM users WHERE name=\"".$_POST['Username']."\"");
|
спасает?
или как-то вот так надо?
<?php
// преобразование ' в `
if (!get_magic_quotes_gpc()) {
$_POST['Username'] = mysql_escape_string($_POST['Username']);
$_POST['Password'] = mysql_escape_string($_POST['Password']);
}
?>
|
| |
|
|
|
|
|
|
|
для: afdm
(19.01.2008 в 22:10)
| | Для текстовых полей лучше использовать последний вариант. | |
|
|
|
|
|
|
|
для: afdm
(19.01.2008 в 22:10)
| |
if (!get_magic_quotes_gpc()) {
$_POST['Username'] = mysql_escape_string($_POST['Username']);
$_POST['Password'] = mysql_escape_string($_POST['Password']);
}
|
если я не ошибаюсь, тут вы обезопасите только данные,
пришедшие методом POST|GET|COOKIE
остальные же данные, например то же ЮЗЕР_АГЕНТ,
если записываете данные в БД, нужно по любому обработать... | |
|
|
|
|
|
|
|
для: а-я
(20.01.2008 в 01:50)
| | Совершенно верно.
Вообще, get_magic_quotes имеет весьма и весьма слабое отношение к БД. | |
|
|
|
|
|
|
|
для: afdm
(19.01.2008 в 22:10)
| | значит всё-таки второй запрос лучше? или первый? или и то (get_magic_quotes_gpc), и то нужно??? | |
|
|
|
|
|
|
|
для: afdm
(20.01.2008 в 11:17)
| | if(get_magic_quotes_gpc() ) $_XXX['xxx'] = stripslashes($_XXX['xxx']); нужно применять при получении данных из входных параметров get post cookie request массивов.
$escaped_val = "'".mysql_escape_string($val)."'"; нужно при формировании литеральных констант в SQL запросе.
В общем случае эти данные и эти процессы никак не связаны между собой.
Например, USER_AGENT , упоминавшийся выше, берется совсем не из get post cookie, и для него первая фаза будет только мешать. | |
|
|
|
|
|
|
|
для: Trianon
(20.01.2008 в 11:28)
| | вот всё понял. пожалуй так и буду делать))) спасибо! теперь всё вроде понятно. | |
|
|
|
|
|
|
|
для: Trianon
(20.01.2008 в 11:28)
| | укажите пожалуйста на ошибки... буду очень вам благодарен!!!
<?php
// соединение с базой данных
include "config.php";
if (get_magic_quotes_gpc()) {
$_POST['login'] = stripslashes($_POST['login']);
$_POST['passw'] = stripslashes($_POST['passw']);
}
if(!preg_match("|^[\d]*$|",$_POST['dd_date_rogd'])
|| !preg_match("|^[\d]*$|",$_POST['mm_date_rogd'])
|| !preg_match("|^[\d]*$|",$_POST['yyyy_date_rogd'])) echo "Неверный формат даты<br>";
if (empty($login)) echo "Не заполненно поле логин<br>";
elseif(!preg_match("|[0-9a-z_\. ]{3,16}|i", $_POST['login'])) echo "Неверно введён логин<br>";
elseif (empty($passw)) echo "Не заполненно поле пароль<br>";
elseif(!preg_match("|[0-9a-z_]{6,20}|i", $_POST['passw'])) echo "Неверно введён пароль<br>";
elseif ($passw != $_POST['confirm_passw']) echo "Пароли не совпадают<br>";
elseif (empty($_POST['email'])) echo "Не заполненно поле e-mail<br>";
elseif (!preg_match("|[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}|i", $_POST['email'])) echo "Неверно введён e-mail<br>";
else {
// экранирование одинарных кавычек \'
$_POST['login'] = mysql_escape_string($_POST['login']);
$_POST['passw'] = mysql_escape_string($_POST['passw']);
$query = @mysql_query("SELECT * FROM users WHERE name='$login'");
if (!$query) puterror("Ошибка выполнения запроса");
if(mysql_num_rows($query)>0) echo "Логин уже занят<br>";
else {
$query = @mysql_query("INSERT INTO users (name, pass) VALUES ('$login',MD5('$passw'))");
if (!$query) puterror("Ошибка при добавлении нового пользователя");
else echo "Пользователь $login зарегистрирован";
}
}
?>
|
Заранее огромное вам всем спасибо! | |
|
|
|
|
|
|
|
для: afdm
(20.01.2008 в 12:56)
| | ап | |
|
|
|
|
|
|
|
для: afdm
(20.01.2008 в 14:25)
| | А они в скрипте имеются? :))) | |
|
|
|
|
|
|
|
для: cheops
(20.01.2008 в 14:34)
| | нет, скрипт конечно же ошибок не выдаёт... :)))
я имею ввиду ошибки, связанные с безопасностью...
правильно ли обработаны все параметры, с учетом всего вышеперечисленного? подскажите, пожалуйста... | |
|
|
|
|
|
|
|
для: afdm
(20.01.2008 в 12:56)
| | По-моему, не стоит тратить время на такие проверки. Проще привести число к integer (если оно должно быть целым), чем делать проверку являются ли все символы цифрами. Одно отличие, которое может нарушить логику скрипта - возможность передавать отрицательные значения.
В любом случае, вместо проверки соответсвия паттерну /^[\d]*$/ (кстати, такой паттерн пропускает пустую строку, что может вызвать ошибку в SQL-запросе) лучше использовать ctype_digit().
Идет обращение к неопределенным переменным $login, $passw. Вообще в скрипте удаляете слеши и эскейпируете символы в $_POST['var'], а добавляете и проверяете $var.
Паттерн для e-mail ущемляет права владельцев ящиков на, допустим, доменах в зонах info, travel и т.д.
Если храните хеш, то не стоит, наверное, выдавать ошибку, если пароль длиннее 20 символов. И почему-то Вы так ограничиваете пользователя в наборе символов для пароля...На радость взломщикам. | |
|
|
|
|
|
|
|
для: Unkind
(20.01.2008 в 14:42)
| | спасибо Unkind за советы...
пожалуй, действительно не буду вводить ограничения на длину пароля. кстати, а какое самое длинное название зоны? travel, 6 знаков? или ещё есть какие-то?
> В любом случае, вместо проверки соответсвия паттерну /^[\d]*$/ (кстати, такой паттерн пропускает пустую строку, что может вызвать ошибку в SQL-запросе) лучше использовать ctype_digit().
можно поподробнее? а такой паттерн специально должен пропускать пустую строку, т.к. поле не явл. обязательным.
> Идет обращение к неопределенным переменным $login, $passw.
да простите, не заметил... просто раньше они были, а сейчас нет. исправлено...
PS какие ещё есть замечания??? особенно в плане проверки и вывода ошибок?! | |
|
|
|
|
|
|
|
для: afdm
(20.01.2008 в 15:44)
| | да и ещё! можно ли форму и обработчик запихать в один скрипт? не в смысле как, а в смысле правильно ли это будет? или всё-таки в разных оставить... спасибо! | |
|
|
|
|
|
|
|
для: afdm
(20.01.2008 в 16:39)
| | up! | |
|
|
|
|
|
|
|
для: afdm
(20.01.2008 в 16:39)
| | Ну неужели я написал что-то и вправду без ошибок? :)))
PS все предыдущие замечания учтены и исправлены. | |
|
|
|
|
|
|
|
для: afdm
(20.01.2008 в 23:33)
| |
<?
$query = @mysql_query("SELECT * FROM users WHERE name='$login'");
|
Переменная $login у вас берется из воздуха. | |
|
|
|
|
|
|
|
для: Loki
(21.01.2008 в 11:14)
| | процитирую сам себя: :))
>PS все предыдущие замечания учтены и исправлены.
всё уже исправил... :))
ну раз вроде бы уже нет ошибок, думаю тему можно и закрыть :))) | |
|
|
|
|
|
|
|
для: afdm
(21.01.2008 в 13:21)
| | ещё два вопросика:
первый к Unkind'у: почему нужно использовать ctype_digit(), а не is_int(). Или не принципиально? в чём отличие этих двух функций? (может быть в том, что ctype_digit не пропускает отриц. значения???)
а второй такой: форму и обработчик вообще культурно делать в одном скрипте вместе? или лучше в двух разных? или тоже не принципиально?
спасибо!!! | |
|
|
|
|
|
|
|
для: afdm
(21.01.2008 в 13:26)
| | > почему нужно использовать ctype_digit(), а не is_int(). Или не принципиально? в чём отличие этих двух функций? (может быть в том, что ctype_digit не пропускает отриц. значения???)
a) ctype_digit() проверяет является ли каждый символ цифрами 0-9.
b) is_int() проверяет тип переменной.
<?php
var_dump(ctype_digit('123')); // bool(true)
var_dump(is_int('123')); // bool(false)
var_dump(ctype_digit('-123')); // bool(false)
var_dump(is_int(-123)); // bool(true)
?>
|
на "123" is_int() выдаст false , потому что это не integer, а string | |
|
|
|
|
|
|
|
для: Unkind
(21.01.2008 в 13:34)
| | да. спасибо!!! уже разобрался :))) | |
|
|
|