Intereting Posts

Понимание входного экранирования в PHP

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

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

"Hello", said Jimmy O'Toole. 

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

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

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

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

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

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

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

У этого, очевидно, слишком много черт.

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

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

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

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

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

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

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

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

Что происходит, так это то, что у вас есть Magic Quotes в вашей конфигурации PHP.

Настоятельно рекомендуется, чтобы вы отключали магию, на самом деле, они полностью удалены с PHP 6.

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

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

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

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

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