Подтвердить что ты не робот

Codeigniter - отключить фильтрацию XSS на основе post

Я пытаюсь настроить CMS на обратной стороне сайта, но всякий раз, когда у постданных есть <a href=..., пост-данные обрываются.

У меня есть $config['global_xss_filtering'] = TRUE; в config

Мой вопрос: есть ли способ отключить фильтрацию xss для одного элемента?

например.

$this->input->post('content', true); - включает его, но как отключить его?

Спасибо всем.

ПВС

4b9b3361

Ответ 1

Если вы хотите изменить поведение по умолчанию метода post(), вы можете расширить основную библиотеку ввода, или если вы ленивы, вы можете просто изменить строку 278 (или около того) библиотеки ввода для чтения:

/**
* Fetch an item from the POST array
*
* @access   public
* @param    string
* @param    bool
* @return   string
*/
function post($index = '', $xss_clean = TRUE)
{
    return $this->_fetch_from_array($_POST, $index, $xss_clean);
}

Единственное отличие здесь в том, что я изменил переменную $xss_clean на TRUE вместо FALSE. Теперь вы можете отключить глобальную фильтрацию XSS, и она будет автоматически фильтровать входные данные, если вы не укажете false как второй параметр в своем вызове метода библиотеки ввода post(). Только один метод вниз - это метод get(), и вы можете изменить его таким же образом.

Однако, если бы я был вами, я бы просто расширил родную библиотеку, потому что есть хороший шанс, что вы забудете об этом к моменту обновления CodeIgniter, и тогда вам вдруг станет интересно, почему вы получая атаку XSS. Это будет выглядеть так:

class MY_Input extends CI_Input {

    function My_Input()
    {
        parent::CI_Input();
    }

    function post($index = '', $xss_clean = TRUE)
    {
        return parent::post($index, $xss_clean);
    }
}

Подробнее о расширении библиотек вы можете узнать здесь:

http://codeigniter.com/user_guide/general/creating_libraries.html

Ответ 2

Если вы хотите, чтобы глобальный xss_clean включался и переопределялся только в определенных случаях, вы можете расширить библиотеку ввода, чтобы сохранить клон $_POST для предоставления необработанных данных по запросу:

<?php if (!defined('BASEPATH')) exit('No direct access allowed.');
class MY_Input extends CI_Input {

public function __construct() {
    $this->_POST_RAW = $_POST; //clone raw post data 
    parent::__construct(); 
}

public function post($index = null, $xss_clean = TRUE) { 
    if(!$xss_clean){ //if asked for raw post data -eg. post('key', false)-, return raw data. Use with caution.
        return $this->_POST_RAW[$index];
    }
    return parent::post($index, $xss_clean); 
    }
}
?>

Таким образом, вы можете использовать $this->input->post('mydata', FALSE) для получения необработанных необработанных почтовых данных, даже если xss_clean включен глобально.

Ответ 3

i определен

global $mypost;
$mypost=$_POST;

в index.php моего корня cms

то где-нибудь я могу глобальную переменную типа

global $mypost;

$var=isset($mypost["field"])? $mypost["field"]:"";

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

работал на меня, надеюсь, что это помогает.

Ответ 4

В моем случае решение treeface не работает, но я нашел другой способ. Я сделал MY_Input с _sanitize_globals(), и я добавил, что если будет построено место, где происходит дезинфекция почтовых данных.

// Clean $_POST Data
if (is_array($_POST) AND count($_POST) > 0) {
    foreach ($_POST as $key => $val) {
        if($this->_clean_input_keys($key) != 'my_none_sanitize_field')
        $_POST[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);
    }
}

Ответ 5

Да, расширение для ввода с заменой почтового метода было очень полезным, как и проницательный читатель, который заметил, что он должен быть возвращен parent:: post ($ index, $xss_clean). Я получал ошибки и не думал об этой очевидной ошибке. Исправлено, и я выключен и работает.

Мы используем его для удаления данных post для использования в операциях sql. Хотя методы CI db хороши, у нас есть несколько больших операторов sql, которые проще скомпилировать вручную.

Ответ 6

работа с CI 2.2. Я думаю, что решение из treeface останется input- > get(), input- > cookie() и т.д., не будучи xss_cleaned. (мы используем get в запросах oauth и т.д.). Глобальное изменение конфигурации останавливает их с экранированием конструктором, и основной класс по умолчанию по умолчанию xss_clean равен FALSE...

В основном я реализовал одно и то же решение для большего количества методов.

class MY_Input extends CI_Input {

    /* fixes to allow xss_clean to be disabled on a per field basis
    * [ e.g. tinymce html content with style / class / event attributes ]
    * initial ref : http://stackoverflow.com/questions/3788476/codeigniter-disable-xss-filtering-on-a-post-basis
    * this is based on CI 2.2
    * the above (stackoverflow) solution only updates the post method - which means all the rest ( get, get_post, cookie, server, request_headers, get_request_header)
    * NB : we need GET to allow oauth type activities !
    *
    *   1 - change the global config to xss_clean = false [ otherwise the constructor will 'xss_clean' everything before we have a chance to say no ! ]
    *   2 - make all of methods that take the xss_clean parameter use TRUE as default value
    *   3 - we can now pass the second parameter in as FALSE if we do not want to xss_clean
    */

    function get($index = '', $xss_clean = TRUE)
    {
        return parent::get($index, $xss_clean);
    }

    function post($index = '', $xss_clean = TRUE)
    {
        return parent::post($index, $xss_clean);
    }

    function get_post($index = '', $xss_clean = TRUE)
    {
        return parent::get($index, $xss_clean);
    }

    function cookie($index = '', $xss_clean = TRUE)
    {
        return parent::cookie($index, $xss_clean);
    }

    function server($index = '', $xss_clean = TRUE)
    {
        return parent::server($index, $xss_clean);
    }

    function request_headers($xss_clean = TRUE)
    {
        return parent::request_headers($xss_clean);
    }

    function get_request_header($index, $xss_clean = TRUE)
    {
        return parent::get_request_header($index, $xss_clean);
    }

}

надеюсь, что это кому-то поможет

Ответ 7

вы можете временно отключить его

$this- > config- > set_item ('global_xss_filtering', false);

$c = $this- > input- > post ('content'); затем включите его.

$this- > config- > set_item ('global_xss_filtering', true);