我知道这个问题一再被问到,但我仍然没有找到我喜欢的完美答案,所以又来了......
我一直在阅读很多关于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
之类的字符串也会传递为用户的密码。再说一次,这种情况发生的几率是多少,即使它发生了,我也不会想到可以对网站造成任何真正的伤害。
由于
答案 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保护 - 只需几行代码而且没有性能损失。