Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Защита от XSS и SQL-инъекций
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » Защита от XSS и SQL-инъекций

Страниц (1): [1]
 

1. Ammiak - 06 Октября, 2011 - 09:14:45 - перейти к сообщению
Здравствуйте, есть форма авторизации:
CODE (html):
скопировать код в буфер обмена
  1.  
  2. <form method="post">
  3. <input name="login_auth">
  4. <input name="password_auth" type="password">
  5. </form>
  6.  

В скрипте передаваемые данные лбрабатываю так:
PHP:
скопировать код в буфер обмена
  1.  
  2. $login_auth = trim(strip_tags(htmlspecialchars($_POST['login_auth'])));
  3. $password_auth = trim(md5($_POST['password_auth']));
  4.  

И в запросе так:
PHP:
скопировать код в буфер обмена
  1.  
  2. $result = mysql_query("SELECT * FROM users WHERE `login`='".mysql_real_escape_string($login_auth)."' and `password` = '".mysql_real_escape_string($password_auth)."' LIMIT 1");
  3.  


Форма регистрации:
CODE (html):
скопировать код в буфер обмена
  1.  
  2. <form method="post">
  3. <input name="login">
  4. <input name="password" type="password">
  5. </form>
  6.  

Обработка:
PHP:
скопировать код в буфер обмена
  1.  
  2. $login = trim($_POST['login']);
  3. $password = trim(md5($_POST['password']));
  4.  

В запросе:
PHP:
скопировать код в буфер обмена
  1.  
  2. $query = mysql_query("INSERT INTO `users` (login, password) values ('".mysql_real_escape_string($login)."', '".mysql_real_escape_string($password)."')");
  3.  

Возник вопрос: правильна ли такая обработка в принципе, в частности, обработка паролей: нужно ли применять эти функции к ним? заранее благодарю
2. illy - 06 Октября, 2011 - 09:35:03 - перейти к сообщению
Тоже вопрос задам про защиту.
А что если просто делать проверку в логине лишних символов типа <?;.," ' и т.д.
Если они имеются, то просто выход делать exit;
Либо удалять их, оставляя только буквы,цифры, пробелы.
3. JohnnyB - 06 Октября, 2011 - 09:36:26 - перейти к сообщению
Ammiak пишет:

PHP:
скопировать код в буфер обмена
  1.  
  2. $password = trim(md5($_POST['password']));
  3.  


надо так
PHP:
скопировать код в буфер обмена
  1. $password = md5(trim($_POST['password']));

потому что trim обрезает пробелы, а если сперва зашифровать в md5 то и все пробелы зашифруются и trim после использовать смысла не будет, да и mysqlrealescape лишнее так как после md5 не будет никаких запрещенных символов.
4. Ammiak - 06 Октября, 2011 - 09:56:48 - перейти к сообщению
имхо, в случае с паролями можно делать просто:
Цитата:

$password = md5($_POST['password']);

ведь на то и пароль, чтоб можно было в нём юзать любой символ, в т.ч. пробелы, разве нет?
5. Zuldek - 06 Октября, 2011 - 09:57:48 - перейти к сообщению
illy пишет:
Тоже вопрос задам про защиту.
А что если просто делать проверку в логине лишних символов типа <?;.," ' и т.д.
Если они имеются, то просто выход делать exit;
Либо удалять их, оставляя только буквы,цифры, пробелы.

Дело в том что символов-прокладок много. Если решили идти методом обрезания символа, то просто ставите регулярочку чтобы обработчик принимал только определенные символы (A-z, цифры 0-9 и пр.).

Приведенные топик-стартером фильтры в принципе достаточны, что не сказать о самой форме. Если это критически важная форма авторизации, то я бы добавил каптчу и ограничение на количество повторов ввода, после чего блокировал бы авторизацию с конкретного ip, это усложнит взлом учеток школьниками через разного рода бруты.
6. Ammiak - 06 Октября, 2011 - 09:59:17 - перейти к сообщению
и можно ли через поле password провести xss или инъекцию при такой обработке? (Это я к своему предыдущему посту)
7. Zuldek - 06 Октября, 2011 - 10:01:56 - перейти к сообщению
Ammiak пишет:
и можно ли через поле password провести xss или инъекцию при такой обработке? (Это я к своему предыдущему посту)

Вы используете хеш и нигде не выводите начальные введенные пользователем данные.
Через указанные вами скрипты и через поле password формы атаки рода xss или инжект невозможны.

Однако вполне можно поэкспериментировать с вводом длинных значений в ваши поля, ограничений на это я не нашел. И посмотреть что будет вываливать ваша страница при превышении значением допустимого в поле бд пространства. На данный момент, если не инжект, то перегрузить сервер частыми запросами неограниченный длинны даже через эти 2 поля задача не сложная.
8. Ammiak - 06 Октября, 2011 - 10:21:02 - перейти к сообщению
Цитата:
Однако вполне можно поэкспериментировать с вводом длинных значений в ваши поля, ограничений на это я не нашел.

Ограничение на длину пароля я делал, на стороне клиента через js. Длину логина специально не ограничивал, должна ограничиваться длиной самого инпута (maxlength="36"), в первом посте не указал
9. illy - 06 Октября, 2011 - 10:21:43 - перейти к сообщению
Может ли инъекция навредить при передаче данных.
Вот ввёл он в логин скрипт инъекции и отправил.
Обработчик берёт значение этого логина и просто вносит в базу.
Здесь он никак не навредит? Только при выводе информации?
10. Santehnick - 19 Октября, 2011 - 21:52:41 - перейти к сообщению
illy пишет:
Может ли инъекция навредить при передаче данных.
Вот ввёл он в логин скрипт инъекции и отправил.
Обработчик берёт значение этого логина и просто вносит в базу.
Здесь он никак не навредит? Только при выводе информации?


навредит и еще как, сначала проверят проходит ли sql-injection, специально напишут так, чтобы запрос к базе данных получился бы не верным и соответственно получится ошибка, поймут что есть уязвимость и вместе с этим запросом могут отправить еще какие-нибудь или в этот допишут что-нибудь интересное, зависит от ситуаций и как написан сам запрос. поэтому экранировать нужно всегда. А вот в случае с xss, то тут да, навредить могут только при выводе информации на страницу, но опять же смотри, лучше один раз на этапе записи данных в базу позаботится о преобразовании спец. символов в html сущности при помощи функции htmlspecialchars() и быть уверенным, чем потом быть параноиком и при каждом выводе данных из базы обрабатывать их этой функцией.
(Добавление)
Ammiak пишет:
Цитата:
Однако вполне можно поэкспериментировать с вводом длинных значений в ваши поля, ограничений на это я не нашел.

Ограничение на длину пароля я делал, на стороне клиента через js. Длину логина специально не ограничивал, должна ограничиваться длиной самого инпута (maxlength="36"), в первом посте не указал

нужно все равно проверять на стороне сервера, js при желании смогут отключить в браузере или вообще возьмут данные тебе и отправят при помощи поддельной html-формы. ну или если лень в скрипте проверять, можно в мускуле ограничить, просто задать длину полю и всё, больше этого все равно как не старайся мускуль записывать откажется.

 

Powered by ExBB FM 1.0 RC1