Codeigniter global_xss_filtering - PullRequest
       34

Codeigniter global_xss_filtering

8 голосов
/ 10 октября 2010

В моем конфиге codeigniter у меня есть $config['global_xss_filtering'] = TRUE;. В моем административном разделе у меня есть ckeditor, который генерирует контент внешнего интерфейса.

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

Если я установлю $config['global_xss_filtering'] = FALSE;, код YouTube передается так, как должен. Это связано с тем, что CI помечает «object», «embed» и т. Д. Как «непослушный» и, таким образом, экранируется.

Как я могу обойти фильтрацию xss для этого метода одного контроллера?

Ответы [ 5 ]

8 голосов
/ 11 октября 2010

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

Например, я отключил его для всех моих контроллеров, затем включил его для комментариев, страниц и т. Д.

Одна вещь, которую вы можете сделать, это создать MY_Input (или MY_Security в CI 2), как в PyroCMS, и переопределить метод xss_clean точной копией, за исключением объекта | embed | часть регулярного выражения.

http://github.com/pyrocms/pyrocms/blob/master/system/pyrocms/libraries/MY_Security.php

Это чертовски далеко, но это работает.

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

2 голосов
/ 22 февраля 2015

В моем случае я хотел, чтобы global_xss_filtering был включен по умолчанию, но иногда мне требовался $ _ POST (pst вы можете сделать это для любого глобального php-массива, например $ _GET ... ) данные должны быть необработанными при отправке из браузера, поэтому я решил:

  1. open index.php в корневой папке проекта
  2. добавили следующую строку кода $ unsanitized_post = $ _POST; после $ application_folder = 'application'; (строка # 92)
  3. тогда всякий раз, когда мне понадобился необработанный $ _ POST , я делал бы следующее:

    global $ unsanitized_post;

    print_r ($ unsanitized_post);

1 голос
/ 21 ноября 2014

В CodeIgniter 2.0 лучше всего переопределить xss_clean в основной библиотеке CI, используя MY_Security.php, поместить его в папку application / core, а затем /application/config.php

.
$config['xss_exclude_uris'] = array('controller/method');

вот MY_Security.php https://gist.github.com/slick2/39f54a5310e29c5a8387:

<?php

/**
 * CodeIgniter version 2
 * Note: Put this on your application/core folder
 */

class MY_Security extends CI_Security {

    /**
     * Method: __construct();
     * magic
     */
    function __construct()
    {
        parent::__construct();
    }

    function xss_clean($str, $is_image = FALSE)
    {

        $bypass = FALSE;

        /** 
         * By pass controllers set in /application/config/config.php
         * config.php
         * $config['xss_exclude_uris'] = array('controller/method')
         */

        $config = new CI_Config;
        $uri = new CI_URI;
        $uri->_fetch_uri_string();
        $uri->_explode_segments();

        $controllers_list = $config->item('xss_exclude_uris');

        // we need controller class and method only
        if (!empty($controllers_list))
        {
            $segments = array(0 => NULL, 1 => NULL);
            $segments = $uri->segment_array();
            if (!empty($segments))
            {
                if (!empty($segments[1]))
                {
                    $action = $segments[0] . '/' . $segments[1];
                }
                else
                {
                    $action = $segments[0];
                }
                if (in_array($action, $controllers_list))
                {
                    $bypass = TRUE;
                }
            }

            // we unset the variable
            unset($config);
            unset($uri);
        }



        if ($bypass)
        {
            return $str;
        }
        else
        {
            return parent::xss_clean($str, $is_image);
        }
    }

}
0 голосов
/ 17 июля 2012

Глобальная фильтрация XSS только избегает (или конвертирует) определенные «опасные» html-теги, такие как <html>

Простой обходной путь:

  1. Установите $config['global_xss_filtering'] = TRUE;
  2. Запустите ваши данные POST через HTMLPurifier, чтобы удалить любые неприятные <script> теги или javascript.
  3. На странице, где вы получаетеданные форм POST используют html_entity_decode(), чтобы отменить действия XSS-фильтрации.

    //by decoding first, we remove everything that XSS filter did
    //then we encode all characters equally.
    $content = html_entity_decode($this->input->post('template_content'))
    
  4. Затем немедленно запустите его через htmlentities ()

    $content = htmlentities($content);
    
  5. Сохранить как Blob в базе данных MySQL

  6. Когда вы хотите отобразить информацию для редактирования пользователем, запустите html_entity_decode()

Вот как я это сделал.Если кто-нибудь знает о серьезном недостатке в том, что я сделал, пожалуйста, сообщите мне.Кажется, это работает нормально для меня.Не было неожиданных ошибок.

0 голосов
/ 27 декабря 2010

Просто выполните следующие действия при отображении встроенного объектного кода, например, с YouTube и т. Д .:

echo str_replace(array('&lt;', '&gt;'), array('<', '>'), $embed_filed);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...