Intereting Posts
Создать json Object по php из результата mysql загрузить файл через ajax вставить несколько строк через php-массив в mysql Неожиданный символ на входе: '\' (ASCII = 92) state = 1 в приложении Silex PHP: использование пробелов в индексах ассоциативного массива Захват символов linebreaks (newline, linefeed) в текстовом поле Laravel 4 – Отправка ввода обратно при неудачной отправке Codeigniter – динамическое получение относительного / абсолютного пути вне папки приложения Guzzle возвращает ошибку cURL 3: <url> malformed Запустите sql-запрос с таймаутом в PHP или Как в PHP, чтобы остановить запрос sql, как только он уже начался? Сгенерировать секретный код для сброса пароля как избежать ввода, но сохранить не привязанные к базе данных Как лучше всего преобразовать данные формы выбора даты CakePHP в объект PHP DateTime? Регулярное выражение для замены относительной ссылки с корневой относительной ссылкой Как изменить разрешенную память выделенной памяти?

Является ли добавление PHP уязвимым для SQL-инъекции?

Возможный дубликат:
Что делает mysql_real_escape_string (), что делает addlashes ()?

Я рассматривал статьи о том, как / почему функция addashes PHP уязвима для SQL-инъекции. Все, что я прочитал, говорит о проблемах с определенными типами кодировки mysql (default-character-set = GBK), или есть проблемы, если magic_quotes включены. Тем не менее, я не смог вырваться из функции addslashes () в этом сценарии и сделать что-то злонамеренное – например, войти в систему как администратор.

$user = addslashes($_POST['user']); $pass = sha1($_POST['pass']); $sql = "SELECT * FROM admins WHERE user = '".$user."' AND `pass` = '".$pass."'"; $nums = mysql_num_rows(mysql_query($sql)); if($nums==1){ $_SESSION['admin_user'] = $user; $_SESSION['admin_pass'] = $pass; 

Это (незначительный) аудит безопасности для клиента, и я рекомендую использовать PDO, но мне нужно отобразить их текущую уязвимость.

Рекомендации:

  • http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string
  • http://hakipedia.com/index.php/SQL_Injection#addslashes.28.29_.26_magic_quotes_gpc

Solutions Collecting From Web of "Является ли добавление PHP уязвимым для SQL-инъекции?"

Shiflett показывает полный рабочий эксплойт в своей записи в блоге. Код, показанный выше, похоже, не соответствует этому примеру, поскольку он не использует набор символов, который обнаруживает эту уязвимость. Тем не менее, отверстие определенно существует.

Даже если это будет безопасно в конкретном сценарии, практика использования addslashes() по-прежнему опасна, и статья Шифлетта должна дать вам достаточно материала для спора, хотя обстоятельства, которые требует эксплоит, очень эзотеричны, и они не являются полностью тривиально воспроизводить.

Если ваш клиент не согласен с опасностью, не видя живого эксплойта в своей конкретной системе, то не стоит делать аудит безопасности.

Является ли добавление PHP уязвимым для SQL-инъекции?

Да. С условиями, указанными в статье, с которой вы связаны.

Мне нужно показать их текущую уязвимость.

Я сомневаюсь, что вы можете отобразить это, так как кажется, что кодировка клиента не является известным GBK.

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

Но я могу заверить вас, что до тех пор, пока кодировка вашего клиента будет однобайтовой или UTF-8, и пока эта функция будет использоваться правильно (как и в коде, который вы опубликовали) – не было бы никакой инъекции.

В вашем конкретном случае не кажется, что выполнить SQL-инъекцию так же просто, но обычная попытка попробовать – это что-то вроде, если я ввожу нулевую переменную unicode? как \0 ? Разве это сломает скрипт и вернет все? Скорее всего, нет.

Итак, вам не всегда нужны косые черты для выполнения SQL-инъекции. Некоторые SQL могут быть написаны так ужасно неправильно, вот пример

 "SELECT * FROM admins WHERE id = $id" 

Если $id – это число, его вполне допустимый SQL, и вы выполняете addslashes на $ id, (кто бы это сделал?). Но для этого конкретного случая все, что вам нужно для SQL-инъекции, равно 1 OR 1=1 что делает запрос похожим

 "SELECT * FROM admins WHERE id = 1 OR 1=1" 

Нет никакого способа, чтобы addslashes или magic_quotes могли защитить вас от такой глупости.

Чтобы вернуться к вопросу, почему кто-то в здравом уме когда-либо использовал GBK над чем-то вроде UTF-8 или UTF-16 ?

Я не уверен, почему вы хотели бы использовать addlashes над mysql_real_escape_string (), но это ваш выбор, я полагаю.

addslashes () делает именно то, что он говорит: строка цитирования с косой чертой

 Example #1 An addslashes() example <?php $str = "Is your name O'reilly?"; // Outputs: Is your name O\'reilly? echo addslashes($str); 

Но некоторые SQL-атаки могут выполняться без кавычек (некоторые инъекции оболочки и некоторые слепые инъекции SQL).

По этой причине я лично использовал mysql_real_escape_string () над addslashes () для обеспечения безопасности ваших данных в этом случае.

Также рассмотрите использование sprintf () для ваших запросов sql, поскольку это делает его несколько более безопасным:

 $query = sprintf("SELECT `username`,`password` FROM admins WHERE user = '%s' AND `pass` = '%s'", $user, $pass); 

Это делает его более безопасным, поскольку он не позволит использовать другие типы данных, чем те, которые вы указали.

% d = цифра% s = строка и т. д.

Надеюсь, это поможет.