网络安全漏洞系列-CSRF漏洞攻防
Posted 美的金融科技
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络安全漏洞系列-CSRF漏洞攻防相关的知识,希望对你有一定的参考价值。
摘要
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。
【CSRF攻击原理】
下面以网上的一幅图来形象地表述CSRF的攻击原理。
【CSRF漏洞危害】
CSRF漏洞是攻击者盗用了你的身份,以你的名义发送恶意的请求,它可以以你的名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账等等,从而造成你的个人隐私泄露以及财产安全收到威胁。
【防御措施】
预防CSRF漏洞,我们需要注意以下几个要点:
1、 加入有效性验证Token
我们保证所有生成的链接都是来自于我们可信域的,通过在生成的链接里加入用户不可控的Token对生成的链接进行校验,可以避免用户生成自己的恶意链接从而被利用。除了有密码、短信验证码、图形验证码校验的功能以外,其他敏感功能都应该加上CSRF防护。类似于图形验证码的方式,在服务端生成随机值,输出到表单的隐藏域中,用户提交请求时再对该值进行校验,以确保请求是由页面正常发起的。如下三步通过加入token来防御CSRF.
1.1 action生成令牌,保存到session
String token = TokenProccessor.getInstance().makeToken();//创建令牌 TokenProccessor.java
/*或者使用SecureRandom生成token
SecureRandom sr = SecureRandom.getInstance( "SHA1PRNG" );
int token = sr.nextInt();//生成32位的整数随机数,还可以进一步对其使用Base64进行编码
*/
request.getSession().setAttribute("token", token); //在服务器使用session保存token(令牌)
request.getRequestDispatcher("/form.jsp").forward(request, response);//跳转到form.jsp页面
1.2 jsp隐藏域中存储生成的token
<form action="${path}/servlet/DoFormServlet" method="post">
<%--使用隐藏域存储生成的token--%>
<input type="hidden" name="token" value="${token}"/>
用户名:<input type="text" name="username">
<input type="submit" value="提交">
</form>
1.3 action处理提交表单
if(invalidToken(request)){
response.sendRedirect(errorUrl);
}else{
response.sendRedirect(redirectUrl);
}
/**
* 判断客户端提交上来的令牌和服务器端生成的令牌是否一致
* @param request
* @return
* true 非法token
* false 合法token
*/
private boolean invalidToken(HttpServletRequest request) {
String client_token = request.getParameter("token");
//1、如果用户提交的表单数据中没有token,则用户是非法请求
if(client_token==null){
return true;
}
//取出存储在Session中的token
String server_token = (String) request.getSession().getAttribute("token");
//2、如果当前用户的Session中不存在Token(令牌),则用户是没有走正常路径进来,是非法请求
if(server_token==null){
return true;
}
//3、存储在Session中的Token(令牌)与表单提交的Token(令牌)不同,则依然是非法请求
if(!client_token.equals(server_token)){
return true;
}
return false;
}
2、关键操作使用二次验证
比如转账,即使用户登录了,即使受到了CSRF攻击,但当钱转出时,进行二次验证(短信验证码, 银行转账密码等等),验证不正确,则取消操作。
3、使用图形验证码
提交图形验证码预防CSRF登录或其他关键操作。
4、通过检查referer要确定连接来自可信任来源。
以上是关于网络安全漏洞系列-CSRF漏洞攻防的主要内容,如果未能解决你的问题,请参考以下文章