CSRF,中文名字,跨站请求伪造。攻击者(黑客,钓鱼网站)盗用了你的身份,以你的名义发送恶意请求,这些请求包括发送邮件、发送消息、盗取账号、购买商品、银行转账,从而使你的个人隐私泄露和财产损失。
防范方案:
1、验证HTTP Referer字段。
2、请求地址中添加token并验证(token不放在cookie中,放在http请求参数中,服务端对其进行验证)
3、将token加入http头属性中,避免了token出现在浏览器中,被泄露。
Referer验证方案:
根据HTTP协议,在HTTP头部中有一个Referer字段,它记录了该HTTP请求所在的地址,表示HTTP请求从那个页面发出的。比如当你访问 http://xxx.com/ebank?account=6000001&amount=10000,用户必须先登录该网站官网,然后通过点击页面的的按钮来触发转账事件。此时,转账请求的Referer值就是转账页面所在的URL,通常是以xxx.com域名开头的地址。如果攻击者要实行CSRF攻击,那么他只能在自己的站点构造请求,此时Referer的值就指向黑客自己的网站。因此要防御CSRF攻击,该网站后台只需要对每一个转账请求验证其Referer值,如果是以xxx.com开头的域名,则是合法请求,相反,则是非法请求并拒绝。这种方法的好处就是简单易行,只需要在后台添加一个拦截器来检查Referer即可。然而这种办法并不是万无一失,Referer的值是由浏览器提供的,一些低级的浏览器可以通过某种方式篡改Referer的值,这就给了攻击者可乘之机;而一些高级浏览器处于安全考虑,可以让用户设置发送HTTP请求时不再提供Referer值,这样当他们正常访问该网站时,因为没有提供Referer值而被误认为CERF攻击,拒绝访问。实际应用中通常采用第二种方法来防御CSRF攻击。
这里简绍第一种方案,验证HTTP Referer字段,在JAVA公共请求拦截器类中,新增对referer的校验,检查请求referer是否与官网域名一致。
//系统官网域名配置
String official_website="www.xxx.com";
String referer = request.getHeader("Referer");
if(null!=referer ){
if(!referer.split("/")[2].endsWith(official_website))
{
OutputStream output = response.getOutputStream();
output.write("请求数据非法".getBytes());
output.flush();
output.close();
return null;
}
}