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

时间:2012-10-21 07:42:36

标签: php codeigniter xss user-input validation

看一下下面的代码:

$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处的默认配置,因此应该没有问题。

3 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:0)

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

它将是一个名为&#39; _remove_evil_attributes&#39;(受保护的方法)的函数 在这个功能中会有一条线 $ evil_attributes = array(&#39; on \ w *&#39;,&#39; style&#39;,&#39; xmlns&#39;,&#39; formaction&#39;); 如果你想在你的输入元素或textareas中允许style属性,那么你需要删除&#39;样式&#39;从这里允许样式属性正常工作,否则它们将自动替换为下面这个函数中编写的这行代码

$ str = preg_replace(&#39; /&lt;(/?[^&gt;&lt;] +?)([^ A-Za-z&lt;&gt; - ])(。?)( &#39; .implode(&#39; |&#39;,$ attribs)。&#39;)(。?)([\ s&gt;&lt;])([&gt;&lt;] *)/ i&#39;,&#39;

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

答案 2 :(得分:0)

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

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

所以,我做到了。

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

请注意,style被写为stile

哪怕是$this->input->post('body', TRUE);

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

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