为什么CodeIgniter的XSS过滤器只对特定事物通过正则表达式做出反应,而不是首先清理所有输入,无论内容是否被污染?另外,为什么在输入期间而不是在输出上完成(就像它应该是?)
答案 0 :(得分:8)
为什么CodeIgniter的XSS过滤器只对特定事物通过正则表达式做出反应,而不是首先清理所有输入,无论内容是否被污染?
这没有多大意义。如果不事先检查它们,我们如何判断某些东西是否“被污染”?
根据CI xss_clean()
的定义,我们不 总是 想要清理输入。正如你所提到的,重要的是输出 - 这就是我们需要注意XSS atacks的地方。如果我们总是“清理”CI的xss_clean()
输入,那么我将如何能够在我的博客上发布javascript或PHP代码示例,或者让用户在评论?它最终会获得[removed]
。
另外,为什么在输入期间而不是在输出上完成(就像它应该是?)
您可以选择在CI配置中启用全局xss过滤器,该配置将在您之前自动在xss_clean()
,$_POST
和$_GET
数据上运行$_COOKIE
可以抓住它。这是保护您自己的最低级别,可以选择始终清除数据。例如:
// With the Input class on $_POST data
$this->input->post('username', TRUE); // Second parameter runs xss_clean
// Using the Security class on any data
$this->security->xss_clean($username);
// Using the Form Validation class to automatically clean the input
$this->form_validation->set_rules('username', '', 'xss_clean');
由于您仍然可以简单地使用$_POST['username']
,因此通过启用全局过滤器,它已经为您进行了xss_cleaned。这是一种懒惰的方法,不幸的是,一旦这些全局变量被清除,就没有办法撤消它。
如果您已经知道可能发生XSS攻击的时间和地点 - 如果您愿意,可以轻松使用该功能。请记住,这不会不神奇地使所有数据“安全”,它只是防止了一些更恶意的代码注入。像</div>
这样无害的东西会通过这个过滤器。您应始终以适当的方式明确清理输入,以用于使用它的上下文。