Codeigniter xss_clean困境

时间:2012-06-07 04:35:58

标签: php codeigniter xss

我知道这个问题一再被问到,但我仍然没有找到我喜欢的完美答案,所以又来了......

我一直在阅读很多关于CI的xss_filter的极端评论。基本上大多数人说这很糟糕。有人可以详细说明它是如何坏,或至少给出一个可能被利用的最可能的场景?我查看了CI 2.1中的安全类,我认为它非常好,因为它不允许像document.cookie,document.write等恶意字符串。

如果网站基本上没有html演示文稿,那么在插入数据库之前使用全局xss_filter(或者它是否真的会影响性能,在每个表单的基础上使用它)是否安全?我一直在阅读关于是否在输入/输出上逃避多数的利弊,说我们应该只在输出上逃避。但话又说回来,为什么允许像<a href="javascript:stealCookie()">Click Me</a>这样的字符串保存在数据库中呢?

我不喜欢的一件事是javascript:,这样就会转换为[removed]。我是否可以扩展CI的安全核心$_never_allowed_str数组,以便永不允许的字符串返回空而不是[removed]

我读过的最合理的错误示例是,如果用户的密码为javascript:123,则会将其清除为[removed]123,这意味着此document.write123之类的字符串也会传递为用户的密码。再说一次,这种情况发生的几率是多少,即使它发生了,我也不会想到可以对网站造成任何真正的伤害。

由于

1 个答案:

答案 0 :(得分:4)

基本上XSS是一个OUTPUT问题 - 但Codeigniter将其作为INPUT问题处理。

  

有人可以详细说明它的坏处......

问题是xss_clean改变你的输入 - 这意味着在某些情况下(比如你所描述的密码问题),输入不是预期的。

  

......或者至少给出一个可能被利用的最可能的场景?

它只查找某些关键词,例如“javascript”。 xss_clean没有检测到其他脚本操作,而且它不会保护您免受任何“新”攻击。

  

我不喜欢的一件事是javascript:这样会被转换为[已删除]。我可以扩展CI的安全核心$ _never_allowed_str数组,以便永远不允许的字符串返回空而不是[已删除]

你可以做到这一点 - 但你只是把一个绑带放在一个糟糕的解决方案上。

  

我一直在阅读关于是否在输入/输出上逃避多数的利弊,说我们应该只在输出时逃避。

这是正确的答案 - 转义所有输出,并且你有真正的XSS保护,而不改变输入。

OWASP explains more on XSS here

See a good Codeigniter forum thread on XSS

我个人在Codeigniter中对XSS保护的方法是我不对输入进行任何XSS清理。我在_output上运行了一个钩子 - 它清除了我的所有“view_data”(这是我用来向视图发送数据的变量)。

如果我不想通过在我的控制器中插入“$ view_data ['clean_output'] = false”来运行XSS Clean,我可以切换:钩子检查:

if (( ! isset($this->CI->view_data['clean_output'])) || ($this->CI->view_data['clean_output']))
   {
    // Apply to all in the list
    $this->CI->view_data = array_map("htmlspecialchars", $this->CI->view_data);
   }  

这为我的整个网站提供了自动和完整的XSS保护 - 只需几行代码而且没有性能损失。