Как предотвратить инъекцию SQL в приложениях LAMP?

Вот несколько способов начать разговор:

  1. Побег всех входных данных при инициализации.
  2. Побег каждого значения, желательно при генерации SQL.

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

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

Я знаю подготовленные заявления , однако я считаю MySQLi громоздким. Кроме того, отключение запроса от входных данных касается меня, потому что, хотя важно правильно настроить порядок, легко сделать ошибку и, таким образом, записать неверные данные в неправильные поля.

как утверждают @Rob Walker, параметризованные запросы – ваш лучший выбор. Если вы используете новейший и самый большой PHP, я настоятельно рекомендую взглянуть на PDO (объекты данных PHP). Это собственная библиотека абстракции базы данных, которая поддерживает широкий диапазон баз данных (включая MySQL, конечно), а также подготовленные операторы с именованными параметрами.

Подготовленные заявления – лучший ответ. У вас есть тестирование, потому что вы можете ошибаться!

См. Этот вопрос.

Я бы пошел с использованием подготовленных заявлений. Если вы хотите использовать подготовленные инструкции, вы, вероятно, захотите проверить функции PDO для PHP. Это не только позволяет вам легко запускать подготовленные операторы, но и позволяет вам быть немного агностиком базы данных, не вызывая функции, которые начинаются с mysql_, mysqli_ или pgsql_.

PDO может когда-нибудь стоить, но это еще не все. Это DBAL, и это может быть (предположительно) упростить переход между поставщиками. На самом деле это не так, чтобы ловить SQL-инъекции.

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

Я всегда использовал первое решение, потому что 99% времени, переменные в $_GET , $_POST и $_COOKIE никогда не выводятся в браузер. Вы также никогда не ошибетесь, напишите код с помощью SQL-инъекции (если вы не используете кавычки в запросе), тогда как со вторым решением вы можете легко забыть избежать одной из ваших строк в конечном итоге.

Фактически, причина, по которой я всегда делала это, была связана с тем, что по умолчанию у всех моих сайтов установлен параметр magic_quotes, и как только вы написали много кода, используя одно из этих двух решений, требуется много работы, чтобы изменить к другому.