文章地址:http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html?login=1#!comments
今天看了一篇讲CSRF攻击的文章。主要如下
一.CSRF是什么?
CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。
二.CSRF可以做什么?
你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账……造成的问题包括:个人隐私泄露以及财产安全。
博主用银行转账举了一个例子,然后有几个想法
- 恶意网站B模拟请求,浏览器带上A的cookie去访问A,通过cookie就能完成身份认证,问题来了,A是怎么记录用户的登陆状态的?如果通过session,B发了一个get去请求A,那么请求头里带上的应该是B的会话ID,A是取不到对应的session记录的。如果通过cookie,可能是这样:cookie里存放了账号密码,请求A的时候,A的后台通过传过来的账号密码比对登陆,显然这种做法不太可能,另外就是cookie里存放了一个类似token的字串,有过期时间,这个token是通过一定的规则生成的,A的后台判断cookie里有这样的token值,并且符合生成的规则,那么就视为这次访问是已登录的状态。
- 第一种做法里,A的更新资源操作用get方式也可以实现。这本身就是一个很危险的做法,违反了http的规范。
防止CSRF攻击的主要做法,就是使用令牌。
就是每次请求时都带上一个随机的令牌。这个令牌是保存在session里。将这个值放在隐藏表单里,提交再和后台作比对。
比如后台有这么一段代码
<?php
define("SECRET","123456");
function m_token(){
return uniqid(rand(),true).SCERET;
}
// 返回的这个值放入session或者cookie'都可以
setcookie("value", m_token(), 3600);
// 前端里有个隐藏表单
// <input type='hidden' value="<?php echo md5($_COOKIE['value']);>" name="hidden_value">
function v_token()
{
if(md5($_COOKIE['value]) ==$_POST['hidden_value'] ) // 通过
}