Боремся с Magic Quotes

Владимир | | Hosting, htaccess, PHP, Web разработка.

На днях я столкнулся с довольно неприятной ситуацией. Скрипт, который прекрасно работал на локальном сервере начал выдавать ошибки на сервере хостера.

Проблема оказалась мелкой и я все быстро исправил, но эта ситуация напомнила мне о законе подлости. Как только забываешь о тестировании – скрипты сразу перестают работать. Не зависимо от того, насколько они простые. 😉

В данном случае дело было во включенных Magic Quotes (волшебных кавычках, хорошее название, появляются как по волшебству там, где не надо 🙂 ).

Вообще-то, использование Magic Quotes не рекомендуемая практика.

В соответствующем разделе PHP manual ясно об этом сказано.

Warning

This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 6.0.0. Relying on this feature is highly discouraged.

Предупреждение

Эта возможность считается устаревшей начиная с PHP 5.3.0 и будет удалена начиная с PHP 6.0.0. Рассчитывать на эту возможность крайне не рекомендуется.

Кратко поясню смысл этой функции. Она перехватывает данные, которые получает скрипт (массивы $_POST, $_GET и т.д.) и экранирует в них специальные символы.

Была разработана для защиты от хакерских атак вроде SQL Injection.

Но на практике от нее больше проблем, чем пользы.

Во-первых, 100% защиты она не обеспечивает. Т.е. вам все равно нужно самостоятельно проверять полученные данные (их тип, диапазон допустимых значений и т.п.). К тому же экранирование символов выполняется автоматически практически всеми библиотеками для работы с БД.

Во-вторых, часто нужны не экранированные данные.

Например, в моем случае ситуация была такой.

1) Клиент (браузер) передавал строку в формате json.
2) PHP при включенной Magic Quotes экранировал спец. символы.
3) функция json_decode возвращала NULL. 🙂

Почему хостеры включают Magic Quotes – вопрос отдельный. Может быть, хотят немного подстраховаться от начинающих разработчиков 😉 Или есть какие-то другие причины. Но в любом случае, вы можете легко ее отключить.

Посмотреть текущие настройки можно с помощью phpinfo(). (если Magic Quotes включена, в разделе Configure Command будет строка --enable-magic-quotes).

Для отключения создаем в папке со скриптами файл .htaccess с одной строчкой.

php_flag magic_quotes_gpc Off

Отключает Magic quotes для входящих данных из массивов GET/POST/Cookie.

Или добавляем эту же строчку в существующий .htaccess.

Примечание. Естественно, Magic Quotes можно отключить и в php.ini, но на shared хостинге у вас к нему доступа нет.

Подробнее об отключении Magic quotes можно почитать в PHP Manual.

Кстати, в нем есть пример функции, которая выполняет обратную операцию (удаляет слеши) — это на случай если хостер отключил поддержку .htaccess. Но, честно говоря, в такой ситуации я бы подумал о смене хостера.

До встречи!