CERF:
基本概念和缩写:
CSRF(Cross-site request forgery)跨站请求伪造
缩写CSRF
-
攻击原理:
image.png
此时网站A在接收到请求之后已经判断当前用户是登录状态,所以恶意网站就可以根据用户的权限做具体的恶意操作了,造成网站攻击成功。
而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookie
用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数
用户C访问正常网站A时进行登录,浏览器保存A的cookie
- 防御措施
防御实例
Sailajs框架中的JavaScript 代码示例
下面将以 JavaScript 为例,对上述三种方法分别用代码进行示例。
1.验证 Referer
// 从 HTTP 头中取得 Referer 值
var referer=req.headers.Referer;
// 判断 Referer 是否以 test.example 开头
if((referer!=null) && (_.startsWith(referer, “test.example ”)){
// 验证通过
}else{
// 验证失败,返回错误
}
2.验证请求中的 token
var session = req.session;
// 从 session 中得到 csrftoken 属性
var token = session.csrftoken;
if(token == null){
// 产生新的 token 放入 session 中
token = generateToken();
token.csrftoken = token ;
return ....
} else{
// 从 HTTP 头中取得 csrftoken
var token = req.headers.csrftoken;
// 从请求参数中取得 csrftoken
var xhrToken = req.param('csrftoken');
if(token != null && xhrToken != null && token.equals(xhrToken)){
return ...
}else{
return ... // ERROR
}
}
HTTP 头中自定义属性(网上例子)
var plainXhr = dojo.xhr;
// 重写 dojo.xhr 方法
dojo.xhr = function(method,args,hasBody) {
// 确保 header 对象存在
args.headers = args.header || {};
tokenValue = '<%=request.getSession(false).getAttribute("csrftoken")%>';
var token = dojo.getObject("tokenValue");
// 把 csrftoken 属性放到头中
args.headers["csrftoken"] = (token) ? token : " ";
return plainXhr(method,args,hasBody);
};
总结
CSRF 是一种危害非常大的攻击,又很难以防范。目前几种防御策略虽然可以很大程度上抵御 CSRF 的攻击,但并没有一种完美的解决方案。一些新的方案正在研究之中,比如对于每次请求都使用不同的动态口令,把 Referer 和 token 方案结合起来,甚至尝试修改 HTTP 规范,但是这些新的方案尚不成熟,要正式投入使用并被业界广为接受还需时日。在这之前,我们只有充分重视 CSRF,根据系统的实际情况选择最合适的策略,这样才能把 CSRF 的危害降到最低
网友评论