Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Аутентификация на php - ошибки и уязвимости


Автор: Frozen_Coyote 10.11.2012, 13:44
Привет всем! Наслушавшись всяких ужасов про неправильную организацию аутентификации пользвателя на сайте + просмотрев по разным форумам все различные самопальные классы, в которых писатели с даром обгаживали чужие творения и с неменьшим жаром защищали свои, решил посветоваться как же более менее грамотно защититься от кражи сессии подмены, отравления и прочее. Ниже я прикладываю простетский свой код, на примере которого, надеюсь, тем, кому не лень будет объяснить или указать на ошибки, можно будет потыкать меня носом smile) Спасибо заранее

итак:

Код

// кнопка "Проверка логина-паролья" нажата
if(isset($_POST["CheckMe"]))
    {
        $res = mysqli_query($connect_to_base,
        "
        SELECT * FROM register_users
        WHERE user_login = '".$_POST["UserLogin"]."' AND user_password = '".md5($_POST["UserPassword"])."'
        "
        );
    // Связка "Логин" - "Пароль" существует в базе
        if(mysqli_num_rows($res) == 1)
        {
         while($e = mysqli_fetch_array($res))
         {
             // Юзер не забанен
             if($e["user_ban"] == 0 and $e["user_confirmed"] == 1)
             {
              // user_uin - это поле в таблице базы, в котором хранится некий uin нашего пользователя, который формируется при регистрации
              $_SESSION["UserSession"] = $e["user_uin"];

                    mysqli_query(
                    $connect_to_base,
                    "
                    UPDATE register_users
                    SET
                    user_ip = '".get_user_ip()."',
                    user_last_enter = '".CurrDate()."'
                    WHERE user_id = '".$_SESSION["own_user_id"]."'
                    "
                    );

                 echo "Привет, старй знакомый";
                }

                // Не забанен, но не подтвердил
                elseif($e["user_ban"] == 0 and $e["user_confirmed"] == 0)
                {
                 echo "Вы не подтвердили свою регистрацию переходом по ссылке высланной вам по e-mail";
                }

                // Забанен
                else
                {
                 echo "Зпрещен доступ";
                }
         }
        }
    // Неправильный логин или пароль
        else
        {
         echo "Неправильный логин или пароль";
        }
    }

Автор: Sanchezzz 10.11.2012, 20:46
WHERE user_login = '".$_POST["UserLogin"]."' AND ...

А кто это сделал??? 

наверняка если вы смотрели много сайтов то там хоть один упомянул то что приходит от пользователя обязательно должно проходить проверку, оберните все что пришло из вне mysqli_real_escape_string(string);

Автор: Frozen_Coyote 10.11.2012, 21:52
да, было такое.. имеете ввиду при регистрации пользователя данные заворачивать перед занесением в базу? или при самой проверке?

Автор: skyboy 11.11.2012, 01:22
Цитата(Frozen_Coyote @  10.11.2012,  20:52 Найти цитируемый пост)
имеете ввиду при регистрации пользователя данные заворачивать перед занесением в базу? или при самой проверке?

SQL injection отлично живет в любом запросе — хоть регистрации, хоть проверке

Автор: Sanchezzz 11.11.2012, 10:42
ТС думаю в этой мини http://www.php.net/manual/ru/security.database.sql-injection.phpу вас убавится пару вопросов.
Скажу сразу что mysqli_real_escape_string это ручной способ когда вы не хотите использовать параметризацию (подготовленные выражения).
Я же вам советую использовать подготовленные выражения http://www.php.net/manual/ru/pdo.prepared-statements.phpили http://www.php.net/manual/ru/mysqli.quickstart.prepared-statements.phpэто поддерживает.

Автор: Frozen_Coyote 14.11.2012, 14:15
Понял, спасибо, поработаю.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)