Понимание экранирования ввода в PHP - PullRequest
4 голосов
/ 19 января 2009

Меня всегда смущает одна вещь - экранирование ввода и то, защищены ли вы от таких атак, как инъекция SQL.

Скажем, у меня есть форма, которая отправляет данные с помощью HTTP POST в файл PHP. Я набираю следующее в поле ввода и отправляю форму:

"Hello", said Jimmy O'Toole.

Если вы напечатаете / отобразите ввод на странице PHP, которая получает эти данные POST, она будет выглядеть так:

\"Hello\", said Jimmy O\'Toole.

Это тот момент, когда это сбивает с толку. Если я помещу эту входную строку в (My) SQL и выполню ее, она попадет в базу данных нормально (поскольку кавычки экранированы), но остановит ли это SQL-инъекцию?

Если я возьму входную строку и вызову что-то вроде mysqli real_escape_string, получится так:

\\"Hello\\", said Jimmy O\\'Toole.

Поэтому, когда он попадает в базу данных через (My) SQL, он заканчивается как:

\"Hello\", said Jimmy O\'Toole.

Это явно слишком много косых черт.

Так что, если вход поступает через HTTP POST как экранированный, нужно ли вам снова экранировать его, чтобы сделать его безопасным для (моего) SQL? Или я просто не вижу здесь ничего очевидного?

Заранее спасибо за любую помощь.

Ответы [ 5 ]

11 голосов
/ 19 января 2009

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

Вот примерная статья предмета: http://www.sitepoint.com/blogs/2005/03/02/magic-quotes-headaches/

Резюме: отключите магические кавычки, используйте real_escape_string().

3 голосов
/ 19 января 2009

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

1 голос
/ 19 января 2009

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

Как писал Чакрит, побег - не лучший способ защитить себя - он намного безопаснее для пользователя параметризованных запросов .

1 голос
/ 19 января 2009

То, что происходит, это то, что у вас Магические кавычки включены в вашей конфигурации PHP.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1006].

Как только вы отключите магические кавычки, вы увидите текст POST, возвращающийся в точности так, как вы ввели его в форму: "Hello", said Jimmy O'Toole. Теперь очевидно, что вам нужно использовать экранирующие функции mysql или, что еще лучше, подготовленные операторы (с подготовленными операторами вы не можете забыть экранировать строку, как это сделано для вас).

0 голосов
/ 19 января 2009

Очевидным является ключевое слово для хакера.

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

См. Эту Таблицу SQL-инъекций , это хороший список тестов, которые вы можете запустить, и посмотрите, хорошо ли слишком много slahses или нет.

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

...