Волшебные цитаты - Magic quotes - Wikipedia

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

Эта функция была официально объявлена ​​устаревшей в PHP 5.3.0 и удалена в PHP 5.4 из соображений безопасности.[1]

Концепция

В текущей редакции руководства по PHP упоминается, что магические кавычки объясняются тем, чтобы «помочь [предотвратить] код, написанный новичками, от опасности».[2] Однако изначально он был введен в PHP 2 как параметр времени компиляции php.h для msql, исключая только одинарные кавычки, «облегчая передачу данных формы непосредственно в запросы msql».[3] Первоначально он был задуман как «функция удобства, а не как функция безопасности».[4][5]

Область использования магических кавычек была расширена в PHP 3. Одинарные кавычки, двойные кавычки, обратная косая черта и нулевые символы во всех предоставленных пользователем данных имеют добавленную обратную косую черту перед их передачей в сценарий в $ _GET, $ _REQUEST, $ _POST и $ _COOKIE глобальные переменные. Теоретически разработчики могут использовать конкатенацию строк для построения безопасных SQL-запросов с данными, предоставленными пользователем. (Это было наиболее точным, когда PHP 2 и PHP 3 были текущими, поскольку основные поддерживаемые базы данных допускали только 1-байтовые наборы символов.)

Критика

Волшебные кавычки были включены по умолчанию в новых установках PHP 3 и 4, но их можно было отключить через magic_quotes_gpc директива конфигурации. Поскольку действие волшебных цитат происходило за кулисами и не сразу становилось очевидным, разработчики могли не знать об их существовании и потенциальных проблемах, которые они могли создать. В документации PHP указано на несколько подводных камней и рекомендуется отключить их, несмотря на то, что они включены по умолчанию.[6]

Проблемы с волшебными цитатами включали:

  • Не все данные, которые предоставляет пользователь, предназначены для вставки в базу данных. Их можно отображать прямо на экране, сохранять в сеансе или предварительно просматривать перед сохранением. Это может привести к тому, что обратная косая черта будет добавлена ​​там, где она не нужна, и будет показана конечному пользователю. Эта ошибка часто проникает даже в широко используемое программное обеспечение.[7]
  • Не все данные, которые предоставляет пользователь и которые используются в запросе к базе данных, получены непосредственно из источников, защищенных магическими кавычками. Например, введенное пользователем значение может быть вставлено в базу данных, защищено магическими кавычками, а затем получено из базы данных и использовано в последующей операции с базой данных. Последнее использование не защищено магическими кавычками, и наивный программист, привыкший полагаться на них, может не осознавать необходимости явно защищать его.
  • Волшебные кавычки также используют общие функции, предоставляемые PHP добавляет слэши () функция, которая не поддерживает Unicode и по-прежнему подвержена уязвимости SQL-инъекций в некоторых кодировках многобайтовых символов. Функции, специфичные для базы данных, такие как mysql_real_escape_string () или, где это возможно, предпочтительны подготовленные запросы со связанными параметрами.[8][9]
  • Хотя многие системы управления базами данных поддерживает экранирование кавычек с помощью обратной косой черты, стандарт фактически требует использования другой кавычки. Магические кавычки не обеспечивают защиты для баз данных, не настроенных для поддержки экранирования кавычек с помощью обратной косой черты.
  • Переносимость является проблемой, если приложение написано с предположением, что магические кавычки включены, а затем перемещено на сервер, где они отключены, или наоборот.
  • Добавление волшебных кавычек и последующее их удаление, где это необходимо, влечет за собой небольшие, но ненужные накладные расходы на производительность.
  • Волшебные цитаты не защищают от других распространенных уязвимостей безопасности, таких как межсайтовый скриптинг нападения или Внедрение заголовка SMTP атаки.

В ноябре 2005 года основные разработчики PHP решили, что из-за этих проблем функция волшебных кавычек будет удалена из PHP 6.[10] Когда разработка PHP 6 застопорилась и вместо этого продолжалась разработка ветки 5.x, эта функция была объявлена ​​устаревшей в PHP 5.3.0 и удалена в 5.4.[1]

Другие подходы

  • Некоторые языки, такие как Perl[11] и Рубин[12] выбрать подход, включающий заражение данных, где данные из ненадежных источников, таких как вводимые пользователем данные, считаются «испорченными» и не могут использоваться для опасных операций, пока явно не отмечены как заслуживающие доверия, обычно после проверки или кодирования. Поскольку построение SQL-запросов в данном контексте считается «опасным», это заставляет программиста решать проблему. Заражение не решает проблему, но выделяет те случаи, в которых есть проблема, чтобы программист мог решить их соответствующим образом.
  • Джоэл Спольски предложил использовать форму Венгерская нотация это указывает, являются ли данные безопасными или небезопасными.[13]
  • Современные СУБД и библиотеки используют параметризованные запросы для передачи данных в базу данных отдельно от команд SQL, что значительно снижает необходимость экранирования данных перед построением запросов.

Смотрите также

Рекомендации

  1. ^ а б «Волшебные цитаты». Руководство по PHP. PHP.net. Получено 2014-01-17.
  2. ^ «PHP: зачем использовать волшебные кавычки?». Документация PHP. Получено 2007-02-19.
  3. ^ "Если переменная MAGIC_QUOTES определена в файле php.h, эти кавычки будут автоматически экранированы, что упростит передачу данных формы непосредственно в запросы msql". Получено 2011-03-27.
  4. ^ «Magic Quotes часто понимают даже опытные программисты PHP».
  5. ^ "Re: [PHP3] что такое magic_quotes?". Список рассылки PHP-dev. 1999-08-27. Получено 2011-01-17.
  6. ^ «PHP: почему бы не использовать волшебные кавычки». Документация PHP. Получено 2007-02-19.
  7. ^ «При редактировании комментария кавычки экранируются дважды». Система отслеживания ошибок WordPress. Получено 2007-02-19.
  8. ^ Крис Шифлетт. "добавляет слэши () против mysql_real_escape_string ()". Получено 2007-02-19.
  9. ^ MySQL AB. «Изменения в версии 5.0.22 (24 мая 2006 г.)». Справочное руководство по MySQL 5.0. Архивировано из оригинал 22 февраля 2007 г.. Получено 2007-02-19.
  10. ^ Группа PHP (12 ноября 2005 г.). "Протокол встречи разработчиков PHP". Получено 2007-02-19.
  11. ^ Дэн Рэгл (18 апреля 2006 г.). «Введение в режим Taint Mode в Perl». webreference.com. Получено 2007-03-21.
  12. ^ «Запирая Руби в сейфе». Программирование на Ruby. Архивировано из оригинал на 2009-05-30. Получено 2014-05-21.
  13. ^ Джоэл Спольски (2005-05-11). "Сделать неправильный код неправильным". Джоэл о программном обеспечении: безболезненное управление программным обеспечением. Получено 2007-02-19.

внешняя ссылка