webew
Войти » Регистрация
 
PHP :: безопасность

Магические кавычки в PHP

21 февраля 2008, 20:47

В PHP существует такое понятие, как "магические кавычки". Магические кавычки — эффект автоматической замены кавычки на обратный слэш и кавычку при операциях ввода/вывода в PHP.

Объясним подробнее. Пусть в форму, в поле с именем name пользователь ввел значение A"B, содержащее кавычку. Тогда, если в настройках PHP включены магические кавычки для GET, POST и COOKIE, после отправления формы в переменной $_POST["name"] будет записано A\"B.

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

Технические детали

В PHP несколько видов магических кавычек. Наиболее распространенные:

  • magic_quotes_gpc (GET/POST/COOKIE) - слеши добавляются ко всем переменным $_GET, $_POST, $_COOKIE
  • magic_quotes_runtime - слэши добавляются к содержимому, читаемому из файлов

magic_quotes_gpc - часто по умолчанию бывают включены, тогда как magic_quotes_runtime практически всегда выключены (что делает их еще более опасными, так как при изменении настроек сервера программа, которая всегда работала, может перестать работать).

Изменить настройки магических кавычек можно несколькими способами:

  1. php.ini на сервере (строчка: magic_quotes_gpc = Off)
  2. php.ini в текущем каталоге
  3. .htaccess в текущем каталоге (строчка: php_flag magic_quotes_gpc Off)
  4. функция php (например, set_magic_quotes_gpc(0))

Возможность изменить настройки тем или иным способом зависит от настроек php (например, может быть запрещено изменение параметров некоторыми из методов 2,3,4).

Автоматическое добавление слэшей аналогично работе функции addslashes(), а именно: слэш добавляется к двойной кавычке, к одинарной кавычке, к слэшу, к символу null. Убрать слэши и вернуть строку в исходное состояние можно функцией stripslashes().

Борьба с магическими кавычками

Мы не будет полагаться на то, что сможем изменить настройки (в некоторых случаях это все-таки невозможно). Поэтому нам требуется правильно обрабатывать оба случая. Для этого, если магические кавычки включены, вырежем их из массивов $_POST, $_GET и $_COOKIE.

<?php

function stripslashes_array($array) {
  return is_array($array) ?
    array_map('stripslashes_array', $array) : stripslashes($array);
}

if (get_magic_quotes_gpc()) {
  $_GET = stripslashes_array($_GET);
  $_POST = stripslashes_array($_POST);
  $_COOKIE = stripslashes_array($_COOKIE);
}

?>

Данное изящное решение взято из кода форума punbb. Другие современные скрипты используют нечто аналогичное. Функция stripslashes_array рекурсивно удаляет все дополнительные слеши из элементов массива, элементов подмассива и.т.д. Функция array_map, применяет заданную функцию ко всем элементам массива. Здесь используется оператор ?: (условие?выражение1:выражение2), результатом которого является выражение1, если условие верно, и выражение 2, если условие неверно.

Можно было бы написать иначе:

<?php
function stripslashes_array($array) {
  if(is_array($array))
    return array_map('stripslashes_array', $array);
  else return stripslashes($array);
}
?>

Статья написана по материалам онлайн-курса «Программирование на PHP».


© Все права на данную статью принадлежат порталу webew.ru. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в печатных изданиях допускается только с разрешения редакции.
Добавить комментарий
Отображение комментариев: Древовидное | Плоское

1234ru

Цитата:
элементы массивов $_GET, $_POST, $_COOKIE сами заведомо не являются массивами (по стандарту HTTP это всегда строки)

Т.е. формирование массива в качестве одного из GET-параметров, например, в из формы

<input type="checkbox" name="arr[]" value="1" />
<input type="checkbox" name="arr[]" value="2" />
<input type="checkbox" name="arr[]" value="3" />

является нарушением стандартов?
То, что не убивает нас, делает нас инвалидами.
29.10.2008, 13:29
Ответить
NO USERPIC

rgbeast

Да, пожалуй мой последний комментарий некорректен, надо именно рекурсивное вырезание слешей.
29.10.2008, 13:49
Ответить

1234ru

Я, на самом деле, тоже точно не знаю. Просто в соседней теме bur написал:

http://webew.ru/articles/743.webew#1472

вот, я подумал, что это по стандарту (на самом деле, я думаю, что это действительно по стандарту, т.к. если бы нет, то с точки зрения стандарта это была бы такая дикость, что, наверное, даже не работало бы).
То, что не убивает нас, делает нас инвалидами.
29.10.2008, 15:10
Ответить
NO USERPIC

rgbeast

HTML не может противоречить стандарту HTTP, поэтому bur прав.

Стандарт URI оставляет особенности интерпретации того, что после знака ? на волю приложений:
http://tools.ietf.org/html/rfc2396

rfc2396
The query component is a string of information to be interpreted by
the resource.
29.10.2008, 15:43
Ответить
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
© 2008—2017 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100

Реклама: