«Волшебные Кавычки» (Magic Quotes)
«Волшебные Кавычки» (Magic Quotes) — это процесс, который позволяет автоматически экранировать входные данные PHP скрипта. Данный принцип позволяет экранировать внешние данные, приходящие в PHP скрипт во время его выполнения.
Что представляют собой «Волшебные Кавычки»?
Когда «Волшебные Кавычки» включены (активизированы), все ‘ (одиночные кавычки), « (двойные кавычки), \ (левый слэш) и NULL знаки автоматически экранируются левыми слэшами (\). Данный принцип аналогичен действию функции addslashes().
Существуют три директивы «Волшебных Кавычек»:
Зачем использовать «Волшебные Кавычки»?
1. Это полезно для начинающих программистов PHP
«Волшебные кавычки» были добавлены в PHP, чтобы помочь начинающим программистам языка PHP избегать фатальных последствий для безопасности системы при ошибках в коде написанных PHP скриптов, причем автоматически, без участия самого программиста. Хотя риск SQL инъекций при этом остается возможным, степень такого риска сводится к минимуму.
2. Это довольно удобно
Для того, чтобы вставлять данные в базу данных, «Волшебные Кавычки» можно не добавлять функцией addslashes() на всех Get, Post, и Cookie запросах, а делать это автоматически.
Почему не нужно использовать «Волшебные Кавычки»?
1. Мобильность
Включение экранирования и его выключение влияет на вашу мобильность. Используйте функцию get_magic_quotes_gpc() для проверки активной установки конфигурации «Волшебных Кавычек».
2. Производительность
Поскольку не каждая часть экранируемых данных используется в базах данных, существует потеря производительности PHP, поскольку обработка данных на предмет необходимости «экранирования» влечет за собой некоторую дополнительную нагрузку на систему. При необходимости произвести «экранирование» данных вы можете просто обращаться к соответствующим функциям (таким как addslashes()) и не пребегать к автоматическому экранированию «Волшебными Кавычками».
Вообще, при установке рекоммендуемых значений директив в файле конфигурации php.ini, автоматическое использование «Волшебних Кавычек» отключено, именно по соображениям производительности.
3. Неудобство
Поскольку не все данные нуждаются в экранировании, часто раздражет видеть «Волшебные Кавычки» там, где их не должно быть.Например, используя скрипт посылки электронной почту из формы, и видя связку \’ в полученном сообщении электронной почты. А для устанения данной неприятности вам нужно будет часто прибегать к использованию функции stripslashes(), что, согласитесь, не очень удобно.
Отключение «Волшебных Кавычек»
Директива может быть выключена (off) только на системном уровне, но не во время исполнения скрипта. Так что функция ini_set() в данной ситуации вам не поможет.
Пример 1. Отключение «Волшебных Кавычек» на стороне сервера
Данный пример показывает как установить значение директивы «Волшебных Кавычек» в Off в файле конфигурации php.ini.
; Magic quotes ; ; Magic quotes for incoming GET/POST/Cookie data. magic_quotes_gpc = Off ; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc. magic_quotes_runtime = Off ; Use Sybase-style magic quotes (escape ' with '' instead of \'). magic_quotes_sybase = Off |
Если вам недоступно изменение конфигурационного файла PHP, то вы можете использовать в таком случае .htaccess веб-сервера Apache, используя следующий метод:
php_flag magic_quotes_gpc Off |
Если вам интересен небольшой переносимый PHP код, который позволяет конфигурировать «Волшебные Кавычки» во время исполнения скрипта определенным образом, то для вас ниже приведен листинг этого кода. Этот метод неэффективен, но иногда его использование может помочь. Итак, отключение во ремя исполнения скрипта PHP.
Пример 2. Альтернативный способ отключения «Волшебных Кавычек» во время исполнения скрипта
Технические детали
В 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())
Возможность изменить настройки тем или иным способом зависит от настроек php (например, может быть запрещено изменение параметров некоторыми из методов 2,3,4).
Автоматическое добавление слэшей аналогично работе функции addslashes(), а именно: слэш добавляется к двойной кавычке, к одинарной кавычке, к слэшу, к символу null. Убрать слэши и вернуть строку в исходное состояние можно функцией stripslashes().
☝ Joomla 3.0 не желает устанавливаться — Magic Quotes GPC Off — настройки php.ini не доступны?
- Подробности
- Просмотров: 6099
Joomla 3.0 не желает устанавливаться — Magic Quotes GPC Off — настройки php.ini не доступны?
Столкнулся с проблемой на установки сайта клиента на одном сверх бюджетном хостинге.
Так как бюджет был скромен, и увеличивать его за свой счет не хотелось, при том что хостинг вполне адекватен (и проверен более чем 3 летним вполне успешным сотрудничеством), просто вот такой бюджетный.
Да, кстати если нужен дешевый хостинг для не нагруженных например — сайтов — визиток — ловите реф — ссылку.
Все бухгалтерские документы оформляем и высылает поэтому с этим проблем не должно возникнуть. Разбивать сайты клиентов по аккаунтам — очень удобно, в случае если Вы не сработались с клиентом то просто отдаете логин пароль от аккаунта — и все. А не начинаете хвататься за голову — если бы сайт клиента висел у вас рядом с кучей других сайтов на одном аккаунте хостинга — да вроде бы в итоге получается еще дешевле — но минусов в многих случаях куда больше.
Ребята прислали такую инструкцию:
Инсталлятор joomla 3 некорректно воспринимает значение флага Magic Quotes GPC. Для исправления ситуации вам нужно выполнить некоторые действия (адреса файлов указаны от папки www вашего сайта):
1. Открываем файл:
installation/models/setup.php
2. Прячем код:
// Check for magic quotes gpc. $option = new stdClass; $option->label = JText::_(‘INSTL_MAGIC_QUOTES_GPC’); $option->state = (ini_get(‘magic_quotes_gpc’) == false); $option->notice = null; $options[] = $option;
Это действие не даст joomla проверять параметр
magic quotes gpc
вообще. Но, из-за этого могут случиться различные казусы, типа двойных кавычек при добавлении какой-либо информации на сайт. Поэтому нужно внести некоторые изменения в ядро joomla.3. Открываем:
libraries/joomla/filter/input.php
4. Находим функцию
public function clean($source, $type = ‘string’) { // Handle the type constraint switch (strtoupper($type)) {… }
5. Добавляем перед
return
в самом конце функции слудующий код:
// Handle magic quotes compatibility if(get_magic_quotes_gpc()) $result = self::_stripSlashesRecursive($result);
6. Теперь в конце этого же файла добавляем описание функции
_stripSlashesRecursive:
protected static function _stripSlashesRecursive($value) { $value = is_array($value) ? array_map(array(‘JFilterInput’, ‘_stripSlashesRecursive’), $value) : stripslashes($value); return $value; }
После проведенных действий, проблема определения флага MQGне возникнет.P.s. Не забываем что все эти изменения работаю лишь до тех пор пока вы не обновитесь.
- < Назад
- Вперёд >
Борьба с магическими кавычками
Мы не будет полагаться на то, что сможем изменить настройки (в некоторых случаях это все-таки невозможно). Поэтому нам требуется правильно обрабатывать оба случая. Для этого, если магические кавычки включены, вырежем их из массивов $_POST, $_GET и $_COOKIE.
<?phpfunction 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, если условие неверно.
Можно было бы написать иначе:
<?phpfunction stripslashes_array($array) {
if(is_array($array))
return array_map(‘stripslashes_array’, $array);
else return stripslashes($array);}?>
Статья написана по материалам онлайн-курса «Программирование на PHP».
Все права на данную статью принадлежат порталу webew.ru.
Перепечатка в интернет-изданиях разрешается только с указанием автора
и прямой ссылки на оригинальную статью. Перепечатка в печатных
изданиях допускается только с разрешения редакции.