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

StackOverflow https://stackoverflow.com/questions/47087

  •  09-06-2019
  •  | 
  •  

Вопрос

Вот несколько возможностей начать разговор:

  1. Экранировать весь ввод при инициализации.
  2. Экранируйте каждое значение, желательно при создании SQL.

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

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

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

Это было полезно?

Решение

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

Другие советы

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

Видеть этот вопрос.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top