Защитить от внедрения SQL - PullRequest
6 голосов
/ 20 января 2011

Я занимаюсь разработкой веб-сайта и пытаюсь защитить часть соединения.

Я использовал функцию addslashes на $login, чтобы остановить SQL-инъекцию, но некоторые друзья сказали мне, что недостаточно безопасности. Однако они не показали мне, как использовать эту уязвимость.

Как я могу / мог бы ты взломать этот код? Как я могу защитить это?

<?php

    if ( isset($_POST) && (!empty($_POST['login'])) && (!empty($_POST['password'])) )
    {
        extract($_POST);
        $sql = "SELECT pseudo, sex, city, pwd FROM auth WHERE pseudo = '".addslashes($login)."'";
        $req = mysql_query($sql) or die('Erreur SQL');
        if (mysql_num_rows($req) > 0)
        {
            $data = mysql_fetch_assoc($req);
            if ($password == $data['pwd'])
            {
                $loginOK = true;
            }
        }
    }
    ?>

Ответы [ 6 ]

14 голосов
/ 20 января 2011

Вы должны использовать mysql_real_escape_string для экранирования входных параметров строки в запросе.Используйте приведение типов для очистки числовых параметров и белый список для очистки идентификаторов.

На указанной странице PHP приведен пример внедрения sql в форму входа в систему.

Лучшим решением будет использование подготовленных операторов, вы можете сделать это с помощью PDO или mysqli .

5 голосов
/ 20 января 2011

Вы храните свои пароли в открытом виде! Это серьезная проблема безопасности, если я когда-либо ее видел. Что с этим делать: по крайней мере используйте (для каждого пользователя) соленый хеш пароля, как видно, например, здесь .

2 голосов
/ 20 января 2011

Помимо использования addslashes(), в этом коде есть некоторые случайные проблемы:

  • isset($_POST) всегда TRUE, если вы не запускаете его из командной строки.Вы, вероятно, можете удалить его.
  • empty() очень сложно.Например, если $password = '0', то empty($password) равно ИСТИНА .
  • Вы можете сделать это: if( isset($_POST['login']) && $_POST['login']!='' ){}
  • extract($_POST) - это огромная уязвимость: любой можетустановите переменные в вашем коде извне.
  • $password == $data['pwd'] предполагает, что вы храните пароли в виде простого текста в вашей базе данных.Это ужасная практика.Google для «соленый пароль».
  • Вы также можете сделать $loginOK = $password == $data['pwd'];.Ты понимаешь почему?; -)
2 голосов
/ 20 января 2011

Есть еще одна зияющая дыра в безопасности - extract. Это может уберечь вас от ввода нескольких символов, но открывает слишком много дыр, чтобы упоминать их, поскольку перезапишет любые глобальные переменные.

Что произойдет, если я отправлю это сообщение?

$_POST {
    'login' => 'Admin',
    'loginOK' => 1
}

Угадайте, что, $ loginOK теперь == 1, и я войду в систему как Администратор.

Спасите себя от горя позже и просто используйте переменные, которые вы хотите использовать, вместо того, чтобы полагаться на ужасный хак, который extract.

2 голосов
/ 20 января 2011

Использование:

mysql_real_escape_string($inputToClean);
1 голос
/ 20 января 2011

Вместо addslashes вы должны использовать mysql_real_escape_string.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...