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

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


person Itay Moav -Malimovka    schedule 09.04.2010    source источник
comment
Гм ... потому что он был удален в PHP 6.0 и устарел с PHP 5.3, может быть? :П   -  person Noah Goodrich    schedule 10.04.2010
comment
@Ноа Гудрич: Это проблема курицы и яйца. Эта функция удаляется из-за плохой практики с самого начала? Большинство, вероятно, возразит, что да.   -  person Billy ONeal    schedule 10.04.2010
comment
@ Ноа Гудрич, может быть, или ты уверен?   -  person Itay Moav -Malimovka    schedule 10.04.2010
comment
@ Билли О'Нил - туше. @ Itay Moav - это определенно наверняка. Это плохая практика, и поэтому ее удаляют. Как я уверен, вы уже определились. :)   -  person Noah Goodrich    schedule 10.04.2010


Ответы (6)


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

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

Примечание. Эта функция УСТАРЕЛА, начиная с PHP 5.3.0, и УДАЛЕНА, начиная с PHP 5.4.0.

person Marek Karbarz    schedule 09.04.2010
comment
И даже если данные вставлены в базу данных, magic_quotes_gpc/addslashes может не помочь. - person VolkerK; 10.04.2010

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

  • В случаях, когда отправленные формы отправляются обратно в браузер, косая черта должна быть удалена вручную с помощью вызова stripslashes().
  • Если волшебные кавычки когда-либо будут отключены для этого сервера или код будет перемещен на сервер, где волшебные кавычки не включены, ваши сценарии не будут работать. Или, что еще хуже, не сбоит сразу, а только демонстрирует странное поведение.
  • Любые строковые операции с представленными переменными, даже простые операторы if, должны учитывать возможность деформации косых черт в содержимом.
  • Волшебные кавычки порождают неряшливость разработчиков. Экранирование переменных, вставленных в SQL-запрос (на мой взгляд), — это то, о чем разработчик должен знать и думать. Не просто предполагать, что все денди.
person Justin Ethier    schedule 09.04.2010

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

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

person Billy ONeal    schedule 09.04.2010

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

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

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

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

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

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

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

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

person Michael Madsen    schedule 09.04.2010

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

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

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

person Annika Backstrom    schedule 09.04.2010

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

person Your Common Sense    schedule 09.04.2010