Магические кавычки (Magic Quotes) в PHP и экранирование
Сегодня я хотел бы посвятить статью начинающим, а также тем, кто уже имеет какой-то опыт программирования на PHP, но ни разу не сталкивался с так называемыми «магическими кавычками», но слышал про такие.
Сразу сделаю замечание: эта статья посвящена версиям PHP 4 и 5. В 6-ой версии PHP magic_quotes были убраны и считаются устаревшими (deprecated).
Итак, что такое Magic Quotes.
Если мы посмотрим у себя в php.ini, то найдем там три директивы:
magic_quotes_qpc
magic_quotes_runtime
magic_quotes_sybase
Каждая из них может быть включена (On), либо выключена (Off).
Данные директивы отвечают за экранирование спецсимволов в различных данных поступающих в php-скрипт и выводимых из php-скрипта.
magic_quotes_qpc
Если директива magic_quotes_qpc включена, то экранируются спецсимволы из следующих источников: $_GET, $_POST, $_REQUEST, $_COOKIE, $_ENV (в PHP4). Кстати, на конце имени этой директивы аббревиатура GPC именно от GET/POST/COOKIE.
Например, если в одном из этих источников окажется такой элемент, как одинарная кавычка (‘), двойная кавычка (“), обратный слэш (\) или NULL-символ, то этот элемент будет автоматически экранирован обратным слэшем:
index.php?test=’123′
$test = $_REQUEST[‘test’];
echo $test; // выведет: \’123\’
Таким образом, если мы хотим записать данные из $_REQUEST в базу MySQL например, то нам не нужно экранировать кавычки функцией addslashes, т.к. они уже будут заэкранированы. Но если magic_quotes_gpc отключена, то экранировать нужно принудительно:
index.php?test=’123′
$test = $_REQUEST[‘test’];
if (!get_magic_quotes_gpc()) {
$test = addslashes($test);
}
mysql_query($res, “INSERT INTO test_table (test) VALUES ($test)”);
Как видите здесь я использовал функцию get_magic_quotes_gpc для проверки состояния директивы magic_quotes_gpc. Если директива в выключенном состоянии, то я экранирую переменную $test. В противном случае экранировать нельзя, т.к. получится двойное экранирование. Т.е. если magic_quotes_gpc включена, то:
index.php?test=’123′
$test = addslashes($_REQUEST[‘test’]);
echo $test; // выведет: \\\’123\\\’
Т.е. мы заэкранируем заэкранированное
Директива magic_quotes_gpc экранирует только одинарные кавычки, если включена также директива magic_quotes_sybase. Причем экранирует она одинарную кавычку одинарной кавычкой:
index.php?test=’123′
$test = $_REQUEST[‘test’];
echo $test; // выведет: ”123”
magic_quotes_runtime
Если включена эта директива, то большинство функций, которые возвращают данные из базы например или текстовых файлов, будут возвращать заэкранированные текстовые данные. А если в добавок включена директива magic_quotes_sybase, то экранируются только одинарные кавычки, причем не обратным слэшем, а такой же одинарной кавычкой.
magic_quotes_sybase
Эта директива в довесок к двум предыдущим, как было уже сказано, просто меняет правило экранирования одинарной кавычки и отключает экранирование остальных символов (двойной кавычки, обратного слэша и NULL-символа).
Лично я не понимаю, для чего нужно экранировать кавычку еще одной кавычкой. Но видимо это когда-то было нужно.
Как их все учитывать?
Начну с того, что директивы magic_quotes_runtime и magic_quotes_sybase можно включать/отключать прямо в PHP-скрипте:
ini_set(‘magic_quotes_runtime’, 0);
ini_set(‘magic_quotes_sybase’, 0);
И это я рекомендую делать всем.
А вот значение директивы magic_quotes_qpc можно установить только в php.ini, .htaccess или httpd.conf. Но зачастую хостинг-провайдер дает нам редактировать только .htaccess, да и то не всегда. Поэтому тут вывод один: нужно просто учитывать значение magic_quotes_qpc при работе скриптов, чтобы не было лишних экранирований, или наоборот, недоэкранирований Если эта директива выключена, то использовать addslashes над вводимыми извне данными (из указанных ранее источников).
При условии конечно, что остальные две директивы в состоянии Off.
Бывает и такое, что хостинг-провайдер блокирует функцию ini_set. В этом случае нужно проверять значения директив с помощью ini_get. И если значения нас не устраивают, то лучше обратиться в техподдержку хостинга с просьбой отключить эти директивы.
Magic Quotes - это конечно устаревшие вещи, но не учитывать их опасно в нынешней ситуации, пока мир не перейдет на PHP6.
[ссылка] - “классический” труд на эту тему.
Вроде как пхп 5.3.0 на дворе….. Откуда 6?
6-ая версия в планах
а как экранировать - /
Игорь, написать свою функцию экранирования/замены определенных символов
[…] по теме: Магические кавычки (Magic Quotes) в PHP и экранирование «Волшебные Кавычки» (Magic Quotes) Cоставление […]
В третьем абзаце ошибка, вместо magic_quotes_gpc Вы написали magic_quotes_qpc (третий символ справа).
тут почти везде magic_quotes_Qpc вместо magic_quotes_Gpc