文章地址: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能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账……造成的问题包括:个人隐私泄露以及财产安全。

博主用银行转账举了一个例子,然后有几个想法

  1. 恶意网站B模拟请求,浏览器带上A的cookie去访问A,通过cookie就能完成身份认证,问题来了,A是怎么记录用户的登陆状态的?如果通过session,B发了一个get去请求A,那么请求头里带上的应该是B的会话ID,A是取不到对应的session记录的。如果通过cookie,可能是这样:cookie里存放了账号密码,请求A的时候,A的后台通过传过来的账号密码比对登陆,显然这种做法不太可能,另外就是cookie里存放了一个类似token的字串,有过期时间,这个token是通过一定的规则生成的,A的后台判断cookie里有这样的token值,并且符合生成的规则,那么就视为这次访问是已登录的状态。
  2. 第一种做法里,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'] ) // 通过
}

 

Leave a comment

电子邮件地址不会被公开。 必填项已用*标注