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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: форма авторизации

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: как защититься от sql-inj ?
reffery
Отправлено: 13 Января, 2010 - 09:50:52
Post Id



Новичок


Покинул форум
Сообщений всего: 32
Дата рег-ции: Май 2009  


Помог: 0 раз(а)




В отчетах обнаружена попытка сделать инъекцию на страницу авторизации. Каковы шансы у хакера? Вот код:
PHP:
скопировать код в буфер обмена
  1.  
  2. session_start(); //инициализирум механизм сесссий
  3. if(!isset($_POST['ok']))
  4. {
  5. // если форма не заполнена, то выводим ее
  6.     echo"
  7.   <table width='100%' height='100%'>
  8.    <form method='POST' action='admin.php'>
  9.    <tr><td align=center>
  10.    <table>
  11.    <tr><td>
  12.    <table>
  13.    <tr><td>Login:</td><td>
  14.         <input type='text' name='login' size='15'></td></tr>
  15.    <tr><td>Password:</td><td>
  16.         <input type='password' name='pass' size='15'></td></tr>
  17.    </table>
  18.    </td></tr>
  19.    <tr><td align=center><input type='submit' name='ok' value='enter'></td></tr>
  20.    </table>
  21.    </td></tr>
  22.    </form>
  23.    </table>
  24.    ";
  25. }
  26. else
  27. {    
  28. include 'config.php';
  29. $_POST['login'] = str_replace("'", "", $_POST['login']);
  30. $_POST['login'] = str_replace("/*", "", $_POST['login']);
  31.  
  32. $login= $_POST['login'];
  33. $pass= $_POST['pass'];
  34.  
  35.     //проверяем есть ли пользователь с таким login'ом и password'ом
  36.     $query=("SELECT * FROM `users` WHERE `login`='$login' AND `pass`='$pass' ");
  37.         $res=mysql_query($query);  
  38.         if(mysql_num_rows($res)!=1)
  39.                 {      
  40.                //такого пользователя нет
  41.                echo "Введены не верные логин или пароль";
  42.                 }
  43.         else
  44.                 {
  45.               //пользователь найден
  46.              $_SESSION['login']=$_POST['login'];    //устанавливаем login & pass
  47.              $_SESSION['pass']=$_POST['pass'];
  48.              Header("Location:index.php");    // перенаправляем на index.php
  49.                 }
  50. }
  51.  
  52.  

(Отредактировано автором: 14 Января, 2010 - 05:28:18)

 
 Top
scray
Отправлено: 13 Января, 2010 - 09:56:47
Post Id


Гость


Покинул форум
Сообщений всего: 68
Дата рег-ции: Апр. 2009  


Помог: 0 раз(а)




на форуме уже неоднократно поднималась эта тема...
http://forum.php.su/topic.php?fo...1&topic=3155
 
 Top
Мелкий Супермодератор
Отправлено: 13 Января, 2010 - 15:45:07
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Дыра огромная. Вы пароль не фильтруете! Передайте паролем "pass' or true -- "

И вырезать ' не совсем корректно, пользователи вроде O'nil обидятся...

(Отредактировано автором: 13 Января, 2010 - 15:46:07)



-----
PostgreSQL DBA
 
 Top
vitaliy_mad
Отправлено: 13 Января, 2010 - 22:09:31
Post Id


Участник


Покинул форум
Сообщений всего: 1107
Дата рег-ции: Окт. 2008  
Откуда: Украина, Мариуполь


Помог: 0 раз(а)




в
том случае достаточно экранировать одинарную кавычку и србствено \. этого будет достаточно для предотвращения инъекции. в этом случае будут допустимы все видимые символы. если исключить \ из допустимых - то сначала удалить все \ а потом экранировать кавычку. хотя есть и более "правильные" методы...

(Отредактировано автором: 13 Января, 2010 - 22:10:04)

 
 Top
reffery
Отправлено: 14 Января, 2010 - 05:24:46
Post Id



Новичок


Покинул форум
Сообщений всего: 32
Дата рег-ции: Май 2009  


Помог: 0 раз(а)




Мелкий пишет:
вроде O'nil обидятся...

это не страшно: пользователь будет один
А если я логин и пароль заэкранирую mysql_real_escape_string



К тому же заменю сообщение о том, что пароль и логин неверны на переадрессацию на страницу авторизации:

PHP:
скопировать код в буфер обмена
  1.  
  2. ...
  3. if(mysql_num_rows($res)!=1)
  4.                 {      
  5.                //такого пользователя нет
  6.          Header("Location:admin.php");
  7.         }
  8. ...
  9.  
 
 Top
Pelsh
Отправлено: 14 Января, 2010 - 16:51:00
Post Id



Новичок


Покинул форум
Сообщений всего: 29
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




Еще я бы дал вам совет не хранить пароли в открытом виде, а шифровать их и тогда записывать в БД. а при вводе логина и пароля шифровать их и сравнивать с имеющимися в базе

PHP:
скопировать код в буфер обмена
  1. $pass0=$_POST['pass'];
  2. $login0=$_POST['login'];
  3.  
  4. $passmd5=md5("$pass0");
  5. $loginmd5=md5("$login0");  
  6.  
  7.  
  8. //проверяем есть ли пользователь с таким login'ом и password'ом
  9.         $res=mysql_query("SELECT * FROM таблица_в_БД WHERE user='$loginmd5' AND password='$passmd5'", $db);


написал так по шагам,чтоб понятно было
 
 Top
EuGen Администратор
Отправлено: 14 Января, 2010 - 17:30:04
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Pelsh пишет:

$passmd5=md5("$pass0");
$loginmd5=md5("$login0");

Pelsh пишет:
$res=mysql_query("SELECT * FROM таблица_в_БД WHERE user='$loginmd5' AND password='$passmd5'", $db);

Объясните, пожалуйста, зачем заключать в кавычки и без того строковые переменные, а так же что делает подобный запрос в теме с вопросом о безопасности.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Pelsh
Отправлено: 14 Января, 2010 - 23:11:21
Post Id



Новичок


Покинул форум
Сообщений всего: 29
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




EuGen пишет:
а так же что делает подобный запрос в теме с вопросом о безопасности.


вы сами и ответили на свой вопрос) плохо хранить пароли без шифровки
 
 Top
Hunter
Отправлено: 16 Января, 2010 - 09:36:29
Post Id



Частый гость


Покинул форум
Сообщений всего: 214
Дата рег-ции: Дек. 2009  
Откуда: Блага


Помог: 0 раз(а)




да вовсе необязательно при авторизации пользователя помещать введенные юзером данные в запрос к базе.. их можно сравнивать с уже полученной из базы информацией..
 
 Top
vitaliy_mad
Отправлено: 16 Января, 2010 - 14:02:17
Post Id


Участник


Покинул форум
Сообщений всего: 1107
Дата рег-ции: Окт. 2008  
Откуда: Украина, Мариуполь


Помог: 0 раз(а)




Hunter, такой метод увеличит нагрузку на сервер. запросы SQL выполняются быстрее...
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB