Волшебные цитаты
Волшебные кавычки были особенностью 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.
addslashes()
функция, которая не поддерживает 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, что значительно снижает необходимость экранирования данных перед созданием запросов.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Jump up to: а б «Волшебные цитаты» . Руководство по PHP . PHP.net . Проверено 17 января 2014 г.
- ^ «PHP:Зачем использовать магические кавычки?» . PHP-документация . Проверено 19 февраля 2007 г.
- ^ «Если переменная MAGIC_QUOTES определена в файле php.h, то эти кавычки будут автоматически экранированы, что упрощает передачу данных формы непосредственно в запросы msql» . Проверено 27 марта 2011 г.
- ^ «Волшебные цитаты часто понятны даже опытным PHP-программистам» .
- ^ "Re: [PHP3] что такое Magic_quotes?" . Список рассылки PHP-разработчиков . 27 августа 1999 г. Проверено 17 января 2011 г.
- ^ «PHP:Почему бы не использовать магические кавычки» . PHP-документация . Проверено 19 февраля 2007 г.
- ^ «При редактировании комментария кавычки экранируются дважды» . Трекер проблем WordPress . Проверено 19 февраля 2007 г.
- ^ Крис Шифлетт. «addslashes() вместо mysql_real_escape_string()» . Проверено 19 февраля 2007 г.
- ^ MySQL АБ. «Изменения в версии 5.0.22 (24 мая 2006 г.)» . Справочное руководство по MySQL 5.0 . Архивировано из оригинала 22 февраля 2007 года . Проверено 19 февраля 2007 г.
- ^ Группа PHP (12 ноября 2005 г.). «Протокол встречи разработчиков PHP» . Проверено 19 февраля 2007 г.
- ^ Дэн Рэгл (18 апреля 2006 г.). «Введение в режим Taint в Perl» . webreference.com . Проверено 21 марта 2007 г.
- ^ «Запереть Руби в сейфе» . Программирование Руби . Архивировано из оригинала 30 мая 2009 г. Проверено 21 мая 2014 г.
- ^ Джоэл Спольски (11 мая 2005 г.). «Как сделать неправильный код неправильным» . Джоэл о программном обеспечении: безболезненное управление программным обеспечением . Проверено 19 февраля 2007 г.