繁体   English   中英

Codeigniter 从 html 输入中删除内联样式

[英]Codeigniter removes inline style from html input

看看下面的代码:

$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默认配置,所以应该没有问题。

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

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

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

,这仍然被删除,因为我在application/config/config.php启用了 XSS 过滤。

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

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

它将有一个名为 '_remove_evil_attributes'(protected method) 的函数在这个函数中会有一行 $evil_attributes = array('on\\w*', 'style', 'xmlns', 'formaction'); 如果你想在你的 input 元素或 textareas 中允许 style 属性,那么你需要从这里删除 'style' 以允许 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); 在前端。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM