Как вы предотвращаете внедрение SQL в приложениях LAMP? - PullRequest
7 голосов
/ 06 сентября 2008

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

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

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

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

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

Ответы [ 5 ]

10 голосов
/ 06 сентября 2008

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

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

7 голосов
/ 06 сентября 2008

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

1 голос
/ 06 сентября 2008

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

0 голосов
/ 06 сентября 2008

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

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

0 голосов
/ 06 сентября 2008

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

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

...