Почему включение magic_quotes_gpc считается плохой практикой? - PullRequest
3 голосов
/ 10 апреля 2010

Почему включение magic_quotes_gpc в PHP считается плохой практикой?

Ответы [ 6 ]

13 голосов
/ 10 апреля 2010

Не думаю, что могу объяснить это лучше, чем создатели самого PHP (с комментариями на этой странице): Почему бы не использовать магические кавычки

  • Переносимость. Предполагается, что она включена или выключена, что влияет на переносимость. Для проверки используйте get_magic_quotes_gpc() и, соответственно, код.
  • Производительность: поскольку не каждая часть экранированных данных вставляется в базу данных, при экранировании всех этих данных происходит потеря производительности. Простой вызов экранирующих функций (например, addslashes()) во время выполнения более эффективен. Хотя php.ini-development включает эти директивы по умолчанию, php.ini-production отключает их. Эта рекомендация в основном обусловлена ​​соображениями производительности.
  • Неудобство. Поскольку не все данные нуждаются в экранировании, часто бывает неприятно видеть экранированные данные там, где их не должно быть. Например, отправка по электронной почте из формы и просмотр связки в письме. Чтобы исправить это, может потребоваться чрезмерное использование stripslashes().

Примечание. Эта функция устарела с версии PHP 5.3.0 и удалена с версии PHP 5.4.0.

3 голосов
/ 10 апреля 2010

Согласно статье Что такое Magic Quotes GPC (magic_quotes_gpc) в PHP и php.ini? , есть много недостатков:

  • В случаях, когда отправленные формы отправляются обратно в браузер, необходимо удалить косую черту вручную с помощью вызова stripslashes ().
  • Если для этого сервера когда-либо отключены магические кавычки или код перемещен на сервер, на котором не включены магические кавычки, ваши сценарии завершатся ошибкой. Или, что еще хуже, не терпит неудачу сразу, а проявляет только странное поведение.
  • Любые строковые операции над переданными переменными, даже простые операторы 'if' должны учитывать возможность деформации косой черты в содержимом.
  • Магические кавычки порождают небрежность разработчика. Экранирование переменных, вставленных в SQL-запрос (на мой взгляд) - это то, что разработчик должен знать и думать. Не просто предположить, что все денди.
2 голосов
/ 10 апреля 2010

Потому что отключение заставляет вас писать более безопасный код.

Если мистер О'Мэлли зарегистрируется на вашем сайте, magic_quotes_gpc превратит его фамилию в О'Мэлли, и когда вы вставите ее в базу данных, все будет хорошо.

Проблема в том, что magic_quotes происходит из-за надстрочных знаков - которые не обязательно работают как экранирование для вашей системы баз данных. О'Мэлли может работать, но также возможно обойти это экранирование и выполнить SQL-инъекцию.

Если magic_quotes не включены, вы получите строку O'Malley, и она будет нарушать оператор SQL, такой как

INSERT INTO users (...) VALUES (...,'O'Malley',...)

Обратите внимание, что строка действительно завершается после O.

Кроме того, это приятнее: если бы вы, например, отправили электронное письмо с его именем, вам пришлось бы раздеться - без всякой на то причины. Если нет, вы получите электронное письмо от мистера О'Мэлли.

(Конечно, для ДЕЙСТВИТЕЛЬНО защищенного кода обработки базы данных вы бы хотели использовать параметризованные запросы, так как это лучший способ предотвратить внедрение SQL. И если вы параметризируете, то вам не нужны косые черты в любом случае, и это пустая трата времени, чтобы PHP добавил их.)

2 голосов
/ 10 апреля 2010

Поскольку кто-то может переместить ваш скрипт на сервер, где эта опция не активирована, мгновенно открываются сотни дыр в безопасности вашего приложения. Кроме того, слишком многие думают, что включение магических кавычек делает ваше приложение безопасным. Это не. Вам все еще нужно изучить и проверить каждый элемент ввода, который входит в ваше приложение. Даже если у вас нет проблем с цитатами, у вас могут возникнуть проблемы с межсайтовым скриптингом и т. Д.

Несмотря на то, что эта функция будет удалена в будущих версиях PHP.

1 голос
/ 10 апреля 2010

Очень простой вопрос.
Представьте, что вы хотите отправить данные пользователя по электронной почте. Или вставьте имя пользователя из cookie в форму ввода. Как вы думаете, будет хорошей идеей иметь такие имена, как Боб \ "Баффало \" Билл? Я так не думаю

1 голос
/ 10 апреля 2010

«Магические цитаты» были попыткой PHP держать руки, не позволяя разработчикам стрелять себе в ногу с помощью SQL-инъекции, когда они не знали ничего лучшего. Это устарело в PHP 5.3 и будет удалено в PHP 6.

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

http://us3.php.net/manual/en/security.magicquotes.php

...