看看下面的代码:
$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>
任何想法如何禁用此行为,以便站点管理员能够轻松地为页面上的任何元素分配不同的内联样式?
更新:
我已经在application/config/config.php
中启用了全局 XSS 过滤,因为我一直需要它。
仅当受信任的管理员从后端发布其内容时,我才不需要 XSS 过滤。为此,我手动禁用了 XSS 过滤,如上面的代码中所述。而且我认为手动配置应该覆盖默认配置在config.php
,所以应该没有问题。
根据阿萨德的评论,我已经找到了我的问题所在。
即使现在我已经使用以下方法手动禁用了XSS过滤:
$body = $this->input('body', FALSE);
,它仍然被删除,因为我在application/config/config.php
中启用了 XSS 过滤。
无论如何,我真的不知道为什么无法使用第二个参数覆盖它。
我花了大约 5 个小时来解决这个问题,并找到了简单的解决方案。 首先,您需要找到安全类,它位于您的项目/应用程序/核心中,如果使用了任何代码点火器 cm,则在项目/系统/代码点火器/核心/安全中
那里将有一个名为"_remove_evil_attributes"(受保护的方法)的函数 在这个函数中会有一行 $evil_attributes = array('on\w*', 'style', 'xmlns', 'formaction'); 如果你想在你的输入元素或文本区域中允许样式属性,那么你需要从这里删除"style"以允许样式属性正常工作,否则它们将自动替换为下面这个函数中编写的这行代码
$str = preg_replace('/<(/?[^><]+?)([^A-Za-z<>-])(.?('.implode('|', $attribs)。(.?)([\s><])([><]*)/i', '
所以要小心这件事,不要像我一样浪费你宝贵的时间。 海诚 谢谢
看的不是解决方案,而是解决方法。
对我来说,出于安全原因,我无法禁用全局 XSS 过滤。
所以,我这样做了。
<h1 stile="color:red;">Red</h1>
请注意,style
写为stile
。
即使有$this->input->post('body', TRUE);
也可以接受
现在,我已经在前端使用了str_replace("stile", "style", $body);
。
也许不是最好的解决方案,而是一种可行的解决方法。