Может mysql_real_escape_string ALONE предотвратить все виды SQL-инъекций?

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

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

Ответ 1

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

Кроме того, эта функция не имеет ничего общего с инъекциями.

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

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

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

В зависимости от этой функции в вопросах безопасности, полагая, что она "защитит вашу базу данных от вредоносных пользователей" WILL приведет вас к инъекции.

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

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

Ответ 2

долгое время с тех пор, как я прочитал сообщение в блоге об этом, чтобы оно больше не поддерживалось, НО...

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

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

Ответ 3

Да. Правильно экранируя строку, используя собственные функции запуска mysql, невозможно "вырваться" и выполнить запрос.

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