Magic Quotes - дроби вместо кавычек на сайте

Magic QuotesМагические кавычки (Magic Quotes) в PHP

В данной статье PageRanker.Ru расскажет начинающим, а также тем, кто уже имеет опыт программирования на PHP, о так называемых «магических кавычках».

Эта статья посвящена версиям PHP 4 и 5. В 6-ой версии PHP magic_quotes были убраны и считаются устаревшими (deprecated).

Если у Вас на страницах сайта неверно отображаются введенные данные - кавычки заменяются многократными дробями или использование ссылок не представляется возможным, проблема вероятнее всего в использовании функции magic quotes

Что такое 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 через системный файл .htaccess

А вот значение директивы magic_quotes_qpc можно установить только в php.ini, .htaccess или httpd.conf. Но зачастую хостинг-провайдер дает нам редактировать только .htaccess, да и то не всегда. Поэтому тут вывод один: нужно просто учитывать значение magic_quotes_qpc при работе скриптов, чтобы не было лишних экранирований, или наоборот, недоэкранирований :) Если эта директива выключена, то использовать addslashes над вводимыми извне данными (из указанных ранее источников).

При условии конечно, что остальные две директивы в состоянии Off.

Бывает и такое, что хостинг-провайдер блокирует функцию ini_set. В этом случае нужно проверять значения директив с помощью ini_get. И если значения нас не устраивают, то лучше обратиться в техподдержку хостинга с просьбой отключить эти директивы.

Как отключить magic quotes?

Чтобы отключить магические кавычки

  1. создай в директории файл .htaccess (обязательно начинается с точки)
  2. вставь в ного следующую строку: php_flag magic_quotes_gpc off
  3. залей на сервак

Если хостинг-провайдер разрешил использование файла .htaccess, то все должно получиться.

Чтобы проверить сработало или нет

  1. создаешь PHP-файл со строкой
  2. заливаешь на сервак, запускаешь его
  3. ищешь параметр magic_quotes_gpc, в столбце Local Value должно быть OFF

Как отключить magic quotes через .htaccess?

Если сервер Вашего веб-ресурса находится на Apache, самым простым решением проблемы с магическими кавычками будет добавление данного кода в системный файл .htaccess:


php_value magic_quotes_gpc off

Magic Quotes – это конечно устаревшие вещи, но не учитывать их опасно в нынешней ситуации, пока мир не перейдет на PHP6.

Ваш Пэйджранкер.ру

  • Hits: 7930