Магические кавычки (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.





Читайте также:



8 Ответов на “Магические кавычки (Magic Quotes) в PHP и экранирование”

  1. [ссылка] - “классический” труд на эту тему.

  2. Вроде как пхп 5.3.0 на дворе….. Откуда 6?

  3. novice

    6-ая версия в планах

  4. Игорь

    а как экранировать - /

  5. guest

    Игорь, написать свою функцию экранирования/замены определенных символов

  6. […] по теме: Магические кавычки (Magic Quotes) в PHP и экранирование «Волшебные Кавычки» (Magic Quotes) Cоставление […]

  7. В третьем абзаце ошибка, вместо magic_quotes_gpc Вы написали magic_quotes_qpc (третий символ справа).

  8. Рома

    тут почти везде magic_quotes_Qpc вместо magic_quotes_Gpc :)


© Copyright. . I-Novice. All Rights Reserved. Terms | Site Map