2

看看下面的代码:

$this->input->post('title', FALSE);

我手动禁用了 XSS 过滤。

现在让我们看一些例子:

<p BAD_ATTR_KEY="BAD_ATTR_VAL">Salam</span>

回报:

<p BAD_ATTR_KEY="BAD_ATTR_VAL">Salam</span>

<p style="color: red;">Salam</span>

回报:

<p  red;">Salam</span>

任何想法如何禁用此行为,以便站点管理员能够轻松地将不同的内联样式分配给页面上的任何元素?


更新:

我启用了全局 XSS 过滤,application/config/config.php因为我一直需要它。

只有当受信任的管理员从后端发布他们的内容时,我才需要 XSS 过滤。为此,我手动禁用了上面代码中提到的 XSS 过滤。而且我认为手动配置应该覆盖默认配置config.php,因此应该没有问题。

4

3 回答 3

2

根据Asad的评论,我发现了我的问题所在。

即使现在我已经使用以下方法手动禁用了 XSS 过滤:

$body = $this->input('body', FALSE);

,那仍然被删除,因为我在application/config/config.php.

我真的不知道为什么无论如何不能使用第二个参数覆盖它。

于 2012-10-21T11:05:05.253 回答
1

我在这个问题上花了大约 5 个小时,找到了简单的解决方案。首先,您需要找到安全类,它位于您的项目/应用程序/核心中,如果使用了任何 codeigniter cms,则在 project/system/codeigniter/core/security

那里会有一个名为'_remove_evil_attributes'的函数(受保护的方法)在这个函数中会有一行 $evil_attributes = array('on\w*', 'style', 'xmlns', 'formaction'); 如果要在输入元素或文本区域中允许样式属性,则需要从此处删除“样式”以允许样式属性正常工作,否则它们将自动替换为下面此函数中编写的这行代码

$str = preg_replace('/<(/?[^><]+?)([^A-Za-z<>-])(. ?)('.implode('|', $attribs).' )(. ?)([\s><])([><]*)/i', '

所以要小心这件事,不要像我一样浪费你宝贵的时间。海信谢谢

于 2014-11-25T00:06:01.453 回答
0

看的不是解决方案,而是解决方法

对我来说,出于安全原因,我无法禁用全局 XSS 过滤。

所以,我做到了。

<h1 stile="color:red;">Red</h1>

请注意,style写为stile

即使有$this->input->post('body', TRUE);

现在,我已经str_replace("stile", "style", $body);在前端使用了。

也许不是最好的解决方案,而是一种可行的解决方法。

于 2020-06-27T05:30:34.547 回答