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

控制器初始化后无法禁用 XSS 过滤。

因为如果$config['global_xss_filtering'] = TRUE;config.php文件中启用,CodeIgniter会在初始化之前对$_POST, $_GET,执行 XSS 过滤...$_COOKIEControllersModels

所以当你获得访问权Controller之前,一切都已经完成。

虽然一种解决方案是根据需要禁用$config['global_xss_filtering']并在特定变量上运行 XSS 过滤,但有一种方法可以将原始值(预过滤)保留在某处以供以后使用:

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)
);

注意:我们在 Controller 初始化之前使用它Hook来执行keep_vars()函数(您可能还想考虑使用'pre_system'key)。

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 的钩子之一来完成此操作。

pre_controller 钩子看起来应该为您解决问题。

在页面的中间有一个非常好的教程,向您展示如何覆盖配置项。它在“提供单独的响应格式”部分下。

所以在你的 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 回答