Магические кавычки в PHP
В 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 практически всегда выключены (что делает их еще более опасными, так как при изменении настроек сервера программа, которая всегда работала, может перестать работать).
Изменить настройки магических кавычек можно несколькими способами:
- php.ini на сервере (строчка: magic_quotes_gpc = Off)
- php.ini в текущем каталоге
- .htaccess в текущем каталоге (строчка: php_flag magic_quotes_gpc Off)
- функция php (например, set_magic_quotes_gpc(0))
Возможность изменить настройки тем или иным способом зависит от настроек php (например, может быть запрещено изменение параметров некоторыми из методов 2,3,4).
Автоматическое добавление слэшей аналогично работе функции addslashes(), а именно: слэш добавляется к двойной кавычке, к одинарной кавычке, к слэшу, к символу null. Убрать слэши и вернуть строку в исходное состояние можно функцией stripslashes().
Борьба с магическими кавычками
Мы не будет полагаться на то, что сможем изменить настройки (в некоторых случаях это все-таки невозможно). Поэтому нам требуется правильно обрабатывать оба случая. Для этого, если магические кавычки включены, вырежем их из массивов $_POST, $_GET и $_COOKIE.
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, если условие неверно.
Можно было бы написать иначе:
function stripslashes_array($array) {
if(is_array($array))
return array_map('stripslashes_array', $array);
else return stripslashes($array);
}
?>
Статья написана по материалам онлайн-курса «Программирование на PHP».
© Все права на данную статью принадлежат порталу webew.ru. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в печатных изданиях допускается только с разрешения редакции.