Вот несколько способов начать разговор:
Первое решение является субоптимальным, потому что вам нужно unescape каждое значение, если вы хотите использовать его в чем-либо, кроме SQL, например, вывести его на веб-страницу.
Второе решение имеет гораздо больший смысл, но вручную избежать каждого значения является боль.
Я знаю подготовленные заявления , однако я считаю MySQLi громоздким. Кроме того, отключение запроса от входных данных касается меня, потому что, хотя важно правильно настроить порядок, легко сделать ошибку и, таким образом, записать неверные данные в неправильные поля.
как утверждают @Rob Walker, параметризованные запросы – ваш лучший выбор. Если вы используете новейший и самый большой PHP, я настоятельно рекомендую взглянуть на PDO (объекты данных PHP). Это собственная библиотека абстракции базы данных, которая поддерживает широкий диапазон баз данных (включая MySQL, конечно), а также подготовленные операторы с именованными параметрами.
Подготовленные заявления – лучший ответ. У вас есть тестирование, потому что вы можете ошибаться!
См. Этот вопрос.
Я бы пошел с использованием подготовленных заявлений. Если вы хотите использовать подготовленные инструкции, вы, вероятно, захотите проверить функции PDO для PHP. Это не только позволяет вам легко запускать подготовленные операторы, но и позволяет вам быть немного агностиком базы данных, не вызывая функции, которые начинаются с mysql_, mysqli_ или pgsql_.
PDO может когда-нибудь стоить, но это еще не все. Это DBAL, и это может быть (предположительно) упростить переход между поставщиками. На самом деле это не так, чтобы ловить SQL-инъекции.
Во всяком случае, вы хотите избежать и санатизировать свои входы, используя подготовленные заявления, может быть хорошей мерой (во-вторых, это). Хотя я считаю, что это намного проще, например, используя фильтр .
Я всегда использовал первое решение, потому что 99% времени, переменные в $_GET
, $_POST
и $_COOKIE
никогда не выводятся в браузер. Вы также никогда не ошибетесь, напишите код с помощью SQL-инъекции (если вы не используете кавычки в запросе), тогда как со вторым решением вы можете легко забыть избежать одной из ваших строк в конечном итоге.
Фактически, причина, по которой я всегда делала это, была связана с тем, что по умолчанию у всех моих сайтов установлен параметр magic_quotes, и как только вы написали много кода, используя одно из этих двух решений, требуется много работы, чтобы изменить к другому.