Статьи

Волшебные Кавычки Головные боли

Я часто удивляюсь и / или расстраиваюсь, когда сталкиваюсь с онлайн-приложениями, в которых возникают проблемы с магическими кавычками и экранированием строк. Даже коммерческие PHP-приложения, которые я использую ежедневно, имеют такие проблемы. Наиболее распространенным симптомом является то, что косые черты (/) в конечном итоге появляются во всем содержимом. Например:

Для чего нужен слеш?

Однако есть и другие, менее очевидные проблемы, вызванные плохой обработкой кавычек и экранированием, которые могут быть более серьезными. Несоблюдение кода, отправляемого в запросе к базе данных, может, конечно, приравниваться к уязвимости внедрения SQL-кода , одной из наиболее распространенных и более серьезных дыр в безопасности приложений PHP.

Для непосвященных, Magic Quotes — это функция PHP, которая может автоматически экранировать строки, которые вводятся в PHP. Например, кавычки (‘или “) экранируются
(‘ или «). Другие символы, такие как символы NULL и обратная косая черта, также экранируются.

Я считаю, что введение Magic Quotes было ошибкой, допущенной разработчиками PHP, — ошибкой, за которую разработчики все еще платят. Хотя многие установки PHP теперь отключили все функции Magic Quotes, некоторые установки PHP по-прежнему включают их для обратной совместимости, поэтому проблемы сохраняются.

Итак, какие именно у меня проблемы с Magic Quotes?

Название

Название «Магические цитаты» вряд ли говорит само за себя. «Магия» вообще не помогает описать его значение, а часть «цитаты» вводит в заблуждение. Более подходящим названием для этой проблемной функции будет «Автоматическое экранирование строк». Это не просто кавычки, которые избегаются процессом.

Magic Quotes были предназначены для того, чтобы сделать сценарии более безопасными для начинающих. Однако название «Магические цитаты» загадочно для новичков. Его существование также помогает не дать начинающим узнать, почему строки должны быть экранированы в SQL.

Различные виды

Как будто это не слишком запутанно, в PHP есть три разных типа настроек «Магические кавычки», описанные в руководстве по PHP .

Наиболее распространенным типом является magic_quotes_gpc, который добавляет косые черты к переменным, переданным в приложение PHP через GET, POST или cookie.

Разработчики приложений должны знать, включено ли оно

Тот факт, что настройки Magic Quotes можно включать и выключать, является серьезной проблемой. Если бы он был всегда включен или всегда выключен, проблема была бы не такой серьезной.

Для разработчиков приложений важно знать, включены ли magic_quotes_gpc или magic_quotes_runtime при кодировании. Если magic_quotes_gpc включен, и программист предполагает, что он выключен, и делает строку, выходящую из себя, он получит страшные «лишние слеши» в своем контенте. Если magic_quotes_gpc выключен, и программист предполагает, что он включен, он оставляет себя уязвимым для SQL-инъекций.

Невозможно отключить magic_quotes_gpc в скрипте, потому что урон уже нанесен. Однако можно определить, включен он или выключен, и действовать соответствующим образом. В предыдущем сообщении в блоге (а также в своей книге ) Гарри описывает, как разработчики могут создавать код, который работает независимо от того, включен или выключен magic_quotes_gpc. Этот код можно вставить где-нибудь в вашем приложении (в начале):

// Is magic quotes on? if (get_magic_quotes_gpc()) { // Yes? Strip the added slashes $_REQUEST = array_map('stripslashes', $_REQUEST); $_GET = array_map('stripslashes', $_GET); $_POST = array_map('stripslashes', $_POST); $_COOKIE = array_map('stripslashes', $_COOKIE); }

// Is magic quotes on? if (get_magic_quotes_gpc()) { // Yes? Strip the added slashes $_REQUEST = array_map('stripslashes', $_REQUEST); $_GET = array_map('stripslashes', $_GET); $_POST = array_map('stripslashes', $_POST); $_COOKIE = array_map('stripslashes', $_COOKIE); }

// Is magic quotes on? if (get_magic_quotes_gpc()) { // Yes? Strip the added slashes $_REQUEST = array_map('stripslashes', $_REQUEST); $_GET = array_map('stripslashes', $_GET); $_POST = array_map('stripslashes', $_POST); $_COOKIE = array_map('stripslashes', $_COOKIE); }

// Is magic quotes on? if (get_magic_quotes_gpc()) { // Yes? Strip the added slashes $_REQUEST = array_map('stripslashes', $_REQUEST); $_GET = array_map('stripslashes', $_GET); $_POST = array_map('stripslashes', $_POST); $_COOKIE = array_map('stripslashes', $_COOKIE); }

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

В этой статье Гарри Фьюкс подробно рассматривает проблему. По иронии судьбы у приложения, в котором размещена статья, есть свои проблемы, связанные с Magic Quotes — косые черты в примерах кода (см., Например, зеленый текст) отсутствуют!

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