web-dev-qa-db-ja.com

Codeigniter-投稿ベースでXSSフィルタリングを無効にする

サイトの裏側にCMSを設定しようとしていますが、投稿データに_<a href=..._が含まれていると、投稿データが破棄されます。

設定に_$config['global_xss_filtering'] = TRUE;_があります

私の質問は、1つのアイテムのxssフィルタリングを無効にする方法はありますか?

例えば.

$this->input->post('content', true);-オンにしますが、オフにする方法は?

みんな、ありがとう。

PVS

24
Von Schmytt

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フィルタリングをオフにでき、入力ライブラリのpost()メソッドの呼び出しで2番目のパラメーターとしてfalseを指定しない限り、入力が自動的にフィルター処理されます。 1つ下のメソッドは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

27
treeface

グローバル_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); 
    }
}
?>
_

このようにして、_xss_clean_がグローバルに有効になっている場合でも、$this->input->post('mydata', FALSE)を使用してサニタイズされていない生の投稿データを取得できます。

6
user2966084

私の場合、treefaceのソリューションは機能しませんが、別の方法を見つけました。 _ sanitize_globals()を使用してMY_Inputを作成し、POSTデータをサニタイズする場所に構築がある場合は追加しました。

// 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);
    }
}
1
Tomek

私は定義しました

global $mypost;
$mypost=$_POST;

私のルートcmsのindex.phpで

その後、どこでも私はグローバル変数のようなことができます

global $mypost;

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

フィルタなしで投稿する必要があるときはいつでも。

それが役立つことを願って私のために働いた。

1
muhammad

cI 2.2での作業treefaceのソリューションでは、input-> get()、input-> cookie()などがxss_cleanedされないままになると思います。 (get in 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);
    }

}

これが誰かの助けになることを願っています

0
pugelarouge

はい、postメソッドを置き換えたInputの拡張機能は非常に便利でした。また、親:: post($ index、$ xss_clean)を返す必要があることに気付いた賢明な読者も同様でした。エラーが発生していて、その明らかなエラーについては考えていませんでした。それを修正し、私はオフにして実行しています。

SQLステートメントで使用するために投稿データをエスケープするために使用しています。 CIのdbメソッドは素晴らしいですが、手作業でコーディングするのが簡単な大きなsqlステートメントがいくつかあります。

0
Zac Imboden