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

Форум MySQL

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

 

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

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

тема: Авторизация и инъекции
 
 автор: La Estafa   (09.04.2007 в 16:31)   письмо автору
 
 

Я начинающий, если можно так сказать программист ) И до поры до времени пользовалась подобным вариантом:

mysql_query("SELECT user, password FROM userlist  WHERE user = '$login'  AND password = '$password'")...

Почитала задачки про инъекции. Поняла, что при таком варианте очень все легко взламывается, если не ставить соответствующую защиту.
Но вот наткнулась на еще один вариант. Принцип такой:

$login;
$password;
$sql_result = mysql_query("SELECT user, password FROM userslist");
    $num_row=mysql_num_rows($sql_result);
        while($row = mysql_fetch_object($sql_result))
        {
            if($login == '$row->user' AND $password == '$row->password')
            {
                user_access = 1;
                break;
            }
        }


Хотелось узнать, на сколько второй вариан защищен? Возможны ли для второго варианта инъекции? И какой из вариантов луше использовать?

   
 
 автор: RV   (09.04.2007 в 16:39)   письмо автору
 
   для: La Estafa   (09.04.2007 в 16:31)
 

если у вас будет 200, 500 юзеров в таблице, то уже будет не до инъекций.
лучше пользоваться сторонними библиотеками типа sql_placeholder

   
 
 автор: La Estafa   (09.04.2007 в 16:46)   письмо автору
 
   для: RV   (09.04.2007 в 16:39)
 

Я рассматриваю этот вариант под систему администрирования.. т.е. под отдельную таблицу именно для системы администрировая, куда доступ будут иметь в худшем случае человек 10-15.

   
 
 автор: RV   (09.04.2007 в 16:51)   письмо автору
 
   для: La Estafa   (09.04.2007 в 16:46)
 

тогда сойдет

   
 
 автор: La Estafa   (09.04.2007 в 17:16)   письмо автору
 
   для: RV   (09.04.2007 в 16:51)
 

RV , спасибки )

   
 
 автор: Trianon   (09.04.2007 в 21:20)   письмо автору
 
   для: La Estafa   (09.04.2007 в 16:31)
 

такой вариант работать не будет.
Почитайте про функции get_magic_quotes_gpc(), strip_slashes(), и mysql_escape_string().
Последняя используется для того, чтобы писать запросы, которые было бы в принципе невозможно подвергнуть SQL-инъекции. Первые две - к сожалению, они тоже нужны - для того, чтобы исправить ошибки тех, кто решил бороться с инъекциями методом крестовых походов.

   
 
 автор: La Estafa   (10.04.2007 в 01:21)   письмо автору
 
   для: Trianon   (09.04.2007 в 21:20)
 

Trianon , sms-send
Я писала грубый код, без предварительной обработки, скажем так, это попросту алгоритм... точно так же, как и во втором варианте не плохо было бы изначально написать:

unset $user_access;

Во втором варианте переменные сравниваются не в запросе к базе данных. Я вопрос задала потому, что может быть по незнанию что-то могла пропустить или еще как-то.. и может ли вообще такое быть, потому как я сама еще не все знаю... даже, скажем так, мало чего знаю, только и всего... на данный момент мне важна система безопасности системы при работе со вторым вариантом, по скольку при малом количесте потенциальных пользователей она мне кажется более защищенной даже без применения того, что вы перечислили.

   
 
 автор: sms-send   (10.04.2007 в 00:38)   письмо автору
 
   для: La Estafa   (09.04.2007 в 16:31)
 

Другими словами

mysql_query('SELECT user, password FROM userlist  WHERE user = '.mysql_escape_string($login).'  AND password = '.mysql_escape_string($password));
- вполне надёжно

   
 
 автор: sms-send   (10.04.2007 в 03:51)   письмо автору
 
   для: sms-send   (10.04.2007 в 00:38)
 

>при работе со вторым вариантом, по скольку при малом количесте потенциальных пользователей она мне кажется более защищенной даже без применения того, что вы перечислили.
Только кажется. Есть способы гораздо проще и функциональней, при этом, не уступающие в защищённости:
<?php
function check_login($login,$password){
        
$q=mysql_query('SELECT `password` FROM `userlist` WHERE `user`="'.mysql_escape_string($login).'" LIMIT 1;');
        if(
mysql_num_rows($q)==0)return 'Нет такого пользователя.';
        if(
mysql_result($q,0)!==$password)return 'Неверный пароль.';
        return 
'Авторизация прошла успешно.';
}
$message=check_login($login,$password);
echo 
$message;
?>

   
 
 автор: Trianon   (10.04.2007 в 09:59)   письмо автору
 
   для: sms-send   (10.04.2007 в 03:51)
 

Этот способ недопустим.
Вы видели хотя бы одну априори авторитетную систему, выдающую сообщение "Неверный пароль"? Такие сообщения выдаваться не должны.

   
 
 автор: Loki   (10.04.2007 в 11:58)   письмо автору
 
   для: Trianon   (10.04.2007 в 09:59)
 

Согласен! Авторитетная система должна говорить: "У вас ошибка в третьем и пятом символах пароля".
Честно-честно! Я в кино видел:)

   
 
 автор: Trianon   (10.04.2007 в 12:16)   письмо автору
 
   для: Loki   (10.04.2007 в 11:58)
 

Тогда уж так: Ошибка в пароле: поменяйте местами третий и пятый символы.

   
 
 автор: sms-send   (11.04.2007 в 22:42)   письмо автору
 
   для: Trianon   (10.04.2007 в 09:59)
 

>Этот способ недопустим.
>Вы видели хотя бы одну априори авторитетную систему, выдающую сообщение "Неверный пароль"? Такие сообщения выдаваться не должны.

Я написал пример определения ситуации. А выдавать или не выдавать, это не моё дело. Я, к примеру, при неверном пароле заношу IP-адрес в базу и, если в течение 15 минут совершается более 5 попыток входа с неверным паролем, IP добавляется в бан лист на полчаса.

   
Rambler's Top100
вверх

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