欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

CI中的安全类Security.php--如何防止csrf和xss攻击

大致看了一遍Codeigniter中的关于网络安全的security类,发现在这个类中集中处理了两种攻击模式:csrf和xss
而应对这两种攻击的方法也很分明,csrf是验证,xss是过滤。
先说csrf,其攻击的本来含义就是攻击者伪造网站受信任用户提交请求完成某些操作。所以,csrf一定是要“验明正身”的。codeigniter中,主要是做了cookie和post数据中的验证。如果你在ci的config文件中开启了csrf验证机制,那么程序会在用户访问你的页面时,自动用这个方法md5(uniqid(rand(), TRUE))生成一个随机的字符串,然后将这个字符串种到cookie中去,同时,在此页面的表单上也生成一个隐藏的校验字符串,和刚才这个相同,这个时候,当你提交的时候,security类就去首先验证是否有这个两个值存在,其次验证这两个值是否相等,验证完成后,不论是否相等,重新生成这个随机字符串,重新种入cookie中和放在表单里,这样,就保证每次的提交,都是用户自己提交的并且是唯一的一次。源码如下:
public function csrf_verify()
{
// If no POST data exists we will set the CSRF cookie
if (count($_POST) == 0)
{
return $this->csrf_set_cookie();
}
 
// Do the tokens exist in both the _POST and _COOKIE arrays?
if ( ! isset($_POST[$this->_csrf_token_name]) OR
! isset($_COOKIE[$this->_csrf_cookie_name]))
{
$this->csrf_show_error();
}
 
// Do the tokens match?
if ($_POST[$this->_csrf_token_name] != $_COOKIE[$this->_csrf_cookie_name])
{
$this->csrf_show_error();
}
 
// We kill this since we're done and we don't want to
// polute the _POST array
unset($_POST[$this->_csrf_token_name]);
 
// Nothing should last forever
unset($_COOKIE[$this->_csrf_cookie_name]);
$this->_csrf_set_hash();
$this->csrf_set_cookie();
 
log_message('debug', "CSRF token verified ");
 
return $this;
}
 
 
至于xss,不多说,codeigniter中作者用了大量的正则表达式去做各种匹配和过滤,没有什么多讲的,主要针对各种javascript、img或者各种特殊符号的处理,建议就是大家以后如果需要过滤用户输入的时候,可以先考虑用ci中已经写好的这些过滤xss,因为毕竟重复开发,首先浪费时间,其次效果不一定会比ci的好。为什么这么说,因为源码中,原作者在xss_clean()这个函数开始的地方有以下一段注释:
 
作者表达的意思大致就是为了防止各种隐蔽的xss攻击,做了相当量的工作,相对比较彻底,但是,不能保证万无一失,不过作者自己验证的时候,没有任何xss是可以穿透这层过滤的。

来自  http://login.sina.com.cn/sso/login.php?useticket=0&returntype=META&service=blog&gateway=1&url=http:/...
普通分类: