Может ли mysql_real_escape_string ALONE предотвратить все виды внедрения sql? - PullRequest
11 голосов
/ 22 марта 2012

Возможный дубликат:
SQL-инъекция, которая обходит mysql_real_escape_string ()

Я не видел никакой ценной или устаревшей информации по этому вопросу. Итак, возникает такой вопрос: ПОЛНОСТЬЮ ли mysql_real_escape_string () защищает от SQL-инъекций? И все же он очень устарел (по сравнению с '09), поэтому с php 5.3 и mysql 5.5 в '12 защищает от корки до корки ?

Ответы [ 3 ]

11 голосов
/ 22 марта 2012

mysql_real_escape_string ALONE может предотвратить ничего.

Более того, эта функция не имеет никакого отношения к инъекциям.

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

Использование этой функции простое: когда вам нужно использовать строку в кавычках в запросе, вы должны экранировать ее содержимое. Не из-за мнимых «злонамеренных пользователей», а просто для того, чтобы избежать этих кавычек, которые использовались для разделения строки. Это чрезвычайно простое правило, но все же крайне ошибочное в PHP.

Это просто функция, связанная с синтаксисом, а не связанная с безопасностью.

В зависимости от этой функции в вопросах безопасности, уверенность в том, что она «защитит вашу базу данных от злонамеренных пользователей» БУДЕТ , приведет вас к инъекции.

Вывод, который вы можете сделать сами:
Нет, этой функции недостаточно .

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

4 голосов
/ 22 марта 2012

Давно я читал в блоге об этом, так что это может больше не соответствовать действительности, НО ...

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

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

0 голосов
/ 22 марта 2012

Да. Правильно экранируя строку с помощью собственных функций escape mysql, невозможно «вырваться» и выполнить запрос.

Однако лучшим подходом будет использование подготовленных заявлений. Это сделает много вещей. Используя подготовленные операторы, вы получаете выгоду от еще большей оптимизации из базы данных, и она корректно экранирует любые переданные данные. Взгляните на: http://php.net/manual/en/mysqli.prepare.php

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