CSRF跨站请求伪造,跟xss攻击一样,存在巨大的危害
one click attack/session riding ///xsrf csrf
历史介绍: CSRF这种攻击方式在2000 年已经被国外的安全人员提出,但在国内,知道06年才开始被关注,
08年,国内外的多个大型社区和交互网站分别爆出CSRF漏洞,如:纽约时报,等,现在互联网上的 许多站点仍对此毫无防备,以至于安全界称之为沉睡的巨人
原理:攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是
是却完成了攻击者所期盼的一个操作,比如以你的名义发送邮件,发消息,盗取你的账号,添加系统管理员账号
,甚至购买商品,虚拟货币转账等,如:a网站存在CSRF漏洞,b攻击网站,c为合法用户
1.c----->a 输入用户密码
2.在用户信息通过验证之后,网站a产生cookie信息并返回给浏览器,此时用户登录a
可以正常发送请求到a.
3.用户未退出网站a之前,在同一浏览器中,打开一个网站ab页访问网站b
4.网站B接收到用户请求后,返回一些攻击类代码,并发出一个要求访问第三方站a
5.浏览器在接收到这些攻击代码后,根据网站B请求,在用户
列子。。。
CSRF攻击来源于web的隐藏身份验证机制!web的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但无法保证该请求是用户批准发送的。
CSRF防御:CSRF防御主要从服务端和客户端进行防御,防御效果要从服务端着手较好,现在一般都在服务端进行防御
1.cookie hashing(所有的表单都包含一个尾随机制)
<?php
$value = "defensescrf";
setcookie("cookie",$value,time()+3600);
?>
在表单里加入尾随hash值,以认证这确实是用户发送的请求
<?php $hash = md5($_COOKIE['cookie']); ?> <form method=”POST” action=”transfer.php”> <input type=”text” name=”toBankId”> <input type=”text” name=”money”> <input type=”hidden” name=”hash” value=”<?=$hash;?>”> <input type=”submit” name=”submit” value=”Submit”> </form>
然后在服务端进行hash值验证
<?php if(isset($_POST['check'])) { $hash = md5($_COOKIE['cookie']); if($_POST['check'] == $hash) { doJob(); } else { //... } } else { //... } ?>
这个方法可以杜绝%99
还有用户cookie很容易由于网站的xss漏洞而被盗取,一般的攻击者看到有需要hash值,基本都会放弃,除了某些
2.验证码 每次用户提交都需要用户在表单中填写一个图片上的随机字符串,这个方法可以解决CSRF,但易用性方面不太好,
3.one-time-tokens(不同的表单都包含一个不同的尾随机制)
在实现one-time-tokens时,u需要注意:并行会话的兼容性。如果用户在一个站点上同时打开两个不同的表单,CSRF保护措施不应该影响到他对任何表单的提交