3

この問題については、stackoverflow を含むすべてのサイトを検索しました。

XSS をグローバルに有効にしており、TinyMCE を使用しているページはほとんどありません。これらのページでは、TinyMCE 部分で XSS を有効にしないでください。

約40ページを読んだ後、彼らは皆、次のことをするように言っています:

$tiny_mce = $this->input->post('note'); // xss filtering off

また

$tiny_mce = $this->input->post('note', FALSE); // xss filtering off

私は両方を試しました。ここに私のモデルがあります:

public function edit($id) {

          $tiny_mce = $this->input->post('note'); // xss filtering off
          $userId = $this->ion_auth->get_user_id();
          $data = array(
                        'note' => $tiny_mce
                        ,'postedBy' => $userId);
          $this->db->where('id', $id);
          $this->db->update('company_notes', $data);

}

なぜ機能しないのか誰にもわかりますか?どんな助けでも素晴らしいでしょう!XSSをグローバルにオフにしたくないので、「ベースごと」のアプローチを望んでいます。

編集 してみました

public function edit($id) {
          $this->config->set_item('global_xss_filtering', FALSE);
          $tiny_mce = $this->input->post('note'); // xss filtering off
          $userId = $this->ion_auth->get_user_id();
          $data = array(
                        'note' => $tiny_mce
                        ,'postedBy' => $userId);
          $this->db->where('id', $id);
          $this->db->update('company_notes', $data);

}

しかし、それもうまくいきません。

4

2 に答える 2

7

Controller の初期化後に XSS フィルタリングを無効にする方法はありません。

$config['global_xss_filtering'] = TRUE;at fileを有効にすると、CodeIgniter は、、を初期化する前にconfig.phpXSS フィルタリングを実行し、...$_POST$_GET$_COOKIEControllersModels

したがって、すべてにアクセスできるようになると、Controllerすべてが前に行われます。

解決策は、必要に応じて特定の変数で XSS フィルタリングを無効$config['global_xss_filtering']にして実行することですが、後で使用するために元の値 (事前にフィルター処理された) をどこかに保持する方法があります。

1)をに設定$config['enable_hooks']します。TRUEapplication/config.php

2)に以下を挿入しますapplication/config/hooks.php

$hook['pre_controller'] = array(
    'class'    => '',
    'function' => 'keep_vars',
    'filename' => 'keep_vars.php',
    'filepath' => 'hooks',
    'params'   => array($_POST, $_GET)
);

注:これを使用して、コントローラーが初期化される前に関数Hookを実行しています (キーの使用を検討することもできます)。keep_vars()'pre_system'

3)keep_vars.php以下の内容で内部application/hooks/ディレクトリを作成します。

<?php

function keep_vars ($vars = array())
{
    if (empty($vars)) return;

    global $pre_filter;

    $pre_filter = array();

    foreach ($vars as $var) {
        $pre_filter = array_merge($pre_filter, $var);
    }
}

4)$_GET最後に、コントローラー内またはコントローラー内の変数にアクセスする場合は、メソッド内で$_POSTグローバル変数を定義します。$pre_filter

class Foo extends CI_Controller {

    public function __construct()
    {
        parent::__construct();
    }

    public function bar ()
    {
        // define as global
        global $pre_filter;

        // check the pre XSS filtered values
        print_r($pre_filter);

        // you can get access to pre filtered $_POST['key'] by:
        echo $pre_filter['key'];
    }
}
于 2013-07-16T22:26:44.330 に答える
1

セキュリティドキュメントをさらに3回読んだ後、新しいコントローラーが呼び出されたときにセキュリティ設定が適用されることがわかりました。

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

コントローラーでは機能しません。ただし、CI のフックの 1 つを使用してこれを実現できます。

pre_controller フックは、うまくいくように見えます。

ここのページの途中に、構成項目をオーバーライドする方法を示す非常に優れたチュートリアルがあります。「Serving Separate Response Formats」セクションの下にあります。

したがって、config/hooks.php ファイルに次のように追加します。

$hook['pre_controller'] = array(
   'class'     => 'the_name_of_your_controller',
   'function'  => 'config', //or the name of the function that will fire on preload
   'filename'  => 'the_file_name_of_your_controller.php',
   'filepath'  => 'hooks'                
);

次に、コントローラーに次の関数を追加します。

public function config() {
   $CI      =& get_instance();
   $CI->config->set_item( 'global_xss_filtering', FALSE );
}
于 2013-07-16T20:16:44.850 に答える