Zend Framework и магические кавычки

    Zend Framework & Magic QuotesСразу стоит заметить, что с выходом php 6 эта статья будет не актуальна, а пока…

    Каждый, кто имеет опыт работы с php, наверняка знает или слышал о директиве «magic_quotes_gpc»(магические кавычки). Если флаг директивы установлен в «On», то происходит автоматическое экранирование данных передаваемых в массивах $_GET, $_POST, $_COOKIE(о чём и намекает аббревиатура gpc на конце директивы).

    При разработке сайта на Zend Framework'е одним из требований является отключенные «magic_quotes_gpc». Всё дело в том, что Zend Framework сам экранирует данные и при включённой директиве «magic_quotes_gpc» получается двойное экранирование, что не есть хорошо и красиво. Проблема не была бы столь острой, если бы все хостинги давали право менять значение «magic_quotes_gpc». Я уже не раз сталкивался с такой проблемой и нашёл на мой взгляд довольно элегантное решение.



    В том случае, когда на сервере директива «magic_quotes_gpc» строго установлена в «On» мы будем подключать небольшой плагин, чтобы избежать двойного экранирования:

    /**
    * Плагин убирающий экранирование.
    *
    * Применяется в тех случаях, когда на сервере запрещено отключать magic_quotes_gpc.
    *
    * @category  Zend_Controller_Plugin
    */
    class Singular_Controller_Plugin_StripMagicQuotes extends Zend_Controller_Plugin_Abstract
    {
      /**
       * Вызывается до того, как Zend_Controller_Front войдет в цикл диспетчеризации.
       *
       * @param Zend_Controller_Request_Abstract $request
       * @return void
       */
      public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
      {
        /** Проверяем включина ли директива magic_quotes_gpc */
        if (get_magic_quotes_gpc()) {
          /** Извлекаем полученые параметры */
          $params = $request->getParams();
          /** Рекурсивно применяем метод "exStripSlashes" к каждому элементу массива  */
          array_walk_recursive($params, array($this, 'exStripSlashes'));
          /** Устанавливаем обработанные параметры */
          $request->setParams($params);
        }
      }

      /**
       * Удаляет экранирование символов.
       *
       * @param mixed $value
       * @param mixed $key
       * @return void
       */
      private function exStripSlashes(&$value, $key)
      {
        /** Удаляем экранирование символов */
        $value = stripslashes($value);
      }
    }


    * This source code was highlighted with Source Code Highlighter.


    Не забудьте переименовать имя класса согласно конвенции фреймворка и зарегистрировать плагин:
    /** Получаем экземпляр фронт-контроллера */
    $front = Zend_Controller_Front::getInstance();
    /** Регистрируем плагин */
    $front->registerPlugin(new Singular_Controller_Plugin_StripMagicQuotes());


    * This source code was highlighted with Source Code Highlighter.


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

    Подробнее
    Реклама
    Комментарии 13
    • –1
      Не верю своим глазам. Что, правда? ZF не анализирует get_magic_quotes_gpc()?
      • 0
        Извините, случайно промахнулся комментарием… Смотрите ответ ниже.
        • 0
          Я не иронизирую, просто не ожидал такого (ИМХО, не слишком серьезного) подхода.
          • 0
            Удивительно что никто не написал другого(более рационального) способа решения проблемы, но при этом рейтинг топика отрицательный.

            Или только моя фирма размещает сайты на таких палевных хостингах? =)

        • +1
          а зачем?
          — все знают, что magic_quotes_gpc зло
          — невозможность настроить эту переменную реальная редкость
          — в 5.3 переменная depricated в 6 убрана.
          — тем кому нужно решают данную проблему написанием плагина за 10 минут.
        • 0
          Результат поиска.

          Возможно есть возможность отключить механизм экранирования в фреймворке, но я не нашёл. Если вы знаете — расскажите.
          • 0
            Я думаю в Зенде считают что проще раз отключить в php.ini, apache.conf, nginx.cong… чем каждый раз проверять и менять все назад.
            А Вы считаете по иному?
            • 0
              Проблема не была бы столь острой, если бы все хостинги давали право менять значение «magic_quotes_gpc».

              Этот плагин на тот случай, когда нету возможности отключить magic_quotes_gpc.
          • 0
            I like ZF… I love ZF
            • +1
              мне данное решение почему то не помогло, времени нет разбираться.
              помогло другое

              в файле index.php который лежит в папке public необходимо добавить до запуска вашего приложения

              if (get_magic_quotes_gpc()) {
                function stripslashes_deep($value)
                {
                  $value = is_array($value) ?
                        array_map('stripslashes_deep', $value) :
                        stripslashes($value);

                  return $value;
                }

                $_POST = array_map('stripslashes_deep', $_POST);
                $_GET = array_map('stripslashes_deep', $_GET);
                $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
                $_REQUEST = array_map('stripslashes_deep', $_REQUEST);
              }

              $application->bootstrap()
                    ->run();


              * This source code was highlighted with Source Code Highlighter.
              • 0
                Кстати да, буквально недавно хотел заюзать этот плагин и не получилось. Так и не смог понять почему исправленный в плагине request в контроллере всёравно со слешами… Наверное в последних версиях ZF что-то в корне изменилось. Разгребусь с сессией — займусь изучением.
              • 0
                а почему бы просто в файле .htaccess не прописать следующую директиву (php_flag magic_quotes_gpc off). На моем движке (построенном без ZF) работает на ура на разных хостингах.
                • 0
                  Я же выделил специально жирным:
                  Проблема не была бы столь острой, если бы все хостинги давали право менять значение «magic_quotes_gpc».

                  На некоторых хостингах нету возможности изменять это значение в .htaccess

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.