PHP 5.3 автоматически экранирует $ _GET / $ _ POST из строк формы?

Мой администратор сервера недавно обновился до PHP 5.3, и у меня появляется странная "ошибка" (или функция , как говорят специалисты по PHP). У меня было mysql_real_escape_string вокруг большей части моих данных строковой формы из очевидных соображений безопасности, но теперь кажется, что это экранирование уже выполнено PHP.

<?php

echo $_GET["escaped"];

?>

<form method="get">
    <input type="text" name="escaped" />
</form>

Это выводит, если я ввожу, например, escape 'this test', escape \'this test\'. То же самое происходит, если я использую POST вместо GET.

Связано ли это напрямую с обновлением 5.3, или мой администратор мог активировать автоматический переключатель в файле php.ini?

Кроме того, следует ли мне просто оставить его как есть (в случае, если это действительно хороший механизм защиты от сбоев, который правильно улавливает все переменные получения и публикации), или я должен отключить его (если это вообще возможно!) И вернуться к mysql_real_escape_string? Моя интуиция подсказывает мне, что подход 2 был бы лучшим, но подход 1 был бы в некоторой степени автоматическим. :)

РЕДАКТИРОВАТЬ: На самом деле мне нужно отключить его. Иногда я собираю данные формы и повторно отправляю их в форму клиента, если что-то пошло не так (например, отсутствует поле), поэтому я не хочу, чтобы у него / нее появлялись косые черты из ниоткуда.


person Lazlo    schedule 10.07.2011    source источник
comment
Также следует отметить, что если ваш php.ini файл содержит синтаксическую ошибку, по умолчанию включено magic_quotes_gpc. Поэтому, если вы считаете, что отключили magic_quotes_gpc в своем файле конфигурации, возможно, файл может содержать ошибку, препятствующую применению вашей конфигурации. Личный опыт. :П   -  person Joshua Burns    schedule 29.04.2013


Ответы (4)


Эта «функция» известна как magic_quotes_gpc и не защитит вас от всех атак SQL-инъекций (addslashes вызывается для каждого элемента входных суперглобалов, таких как $_POST и $_GET. Это игнорирует фактическая кодировка ввода / базы данных). Поэтому он устарел, и не следует использовать.

Официальное руководство по php включает удобный способ отменить его в коде php , но вам следует просто выключить его.

person phihag    schedule 10.07.2011
comment
Аккуратный способ отменить его медленный, это O (n), неплохо, но все же может вызвать проблемы с огромным вводом. - person Nicklas A.; 10.07.2011
comment
@Nicklas A. Это может быть медленным, но на первый взгляд кажется, что это самый быстрый способ отменить волшебные цитаты. Не могли бы вы рассказать, как можно улучшить этот код? И если n - это размер всего тела POST, любой алгоритм, отменяющий кодировку текста, займет O (n), не так ли? - person phihag; 10.07.2011
comment
Нет, другого выхода, конечно же, нет. Я просто имел в виду, что изменение php.ini - гораздо лучшее решение :) - person Nicklas A.; 10.07.2011
comment
И да, алгоритм был бы Ω (n) - person Nicklas A.; 10.07.2011
comment
@Lazlo Bonin Не забудьте потом перезагрузить apache. После этого проверьте вывод phpinfo - возможно, вы изменили CLI php.ini вместо apache. Также проверьте с помощью тривиального скрипта php (<?php echo(htmlspecialchars($_POST['x']));) - person phihag; 10.07.2011

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

И вот как вы его выключаете: http://www.php.net/manual/en/security.magicquotes.dispting.php

Вы делаете это либо через php.ini, либо удаляя косые черты из всех переменных в $_GET и $_POST, очевидно, что первый вариант является рекомендуемым.


Как предлагает Уилл Мартин, вы также можете изменить его с помощью .htaccess следующим образом:

php_flag magic_quotes_gpc off

Дополнительная информация здесь: http://php.net/manual/en/configuration.changes.php

person Nicklas A.    schedule 10.07.2011
comment
Приму, когда мне позволит S / O. Никогда не думал, что такая безумная особенность может существовать. Попросил моего администратора отключить его, потому что, к сожалению, ini_set не работает. Grr. - person Lazlo; 10.07.2011
comment
ini_set работает только с тем, что происходит после анализа скрипта, и, к сожалению, экранирование происходит раньше. Волшебные цитаты - зло и только вызывают проблемы, но никогда не решают их. Тем более, что люди могут на них положиться. - person Nicklas A.; 10.07.2011
comment
Вы можете отключить его с помощью .htaccess - это происходит до того, как страница будет проанализирована. php_flag magic_quotes_gpc Off в вашем .htaccess. - person Will Martin; 10.07.2011

проверьте http://www.php.net/manual/en/info.configuration.php#ini.magic-quotes-gpc параметр в php.ini

person Greenisha    schedule 10.07.2011

Похоже, на вашем сервере включены волшебные кавычки - вы можете взглянуть на http://www.php.net/manual/en/security.magicquotes.disables.php для подробного обсуждения способов их отключения.

person Sam Dufel    schedule 10.07.2011