您的位置:首页 > 其它

XSS与CSRF攻击防御概念

2017-03-04 15:53 288 查看
先看这两篇文章:XSS攻击原理及防御措施  CSRF攻击介绍及防御

攻击概念

CSRF跨站请求伪造(Cross-site request forgery)跟XSS攻击一样,存在巨大的危害性

CSRF攻击:攻击者盗用了你的身份信息,以你的名义发送恶意请求。带来的后果就是:个人隐私泄露以及财产安全。

CSRF攻击的思想:

1、登录受信任网站A,并在本地生成Cookie;

2、在不登出A的情况下,访问危险网站B;

3、B要求访问第三方站点A,发出一个请求;

4、根据B的请求,浏览器带着1产生的Cookie访问A;

5、A不知道4中的请求是A发出的还是B发出的,A直接根据用户的权限处理请求,这样B就达到了模拟用户操作的目的。

防御

验证 HTTP Referer 字段,参考文章开篇文章的防御方法一

根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,比如需要访问 http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory,用户必须先登陆 bank.example,然后通过点击页面上的按钮来触发转账事件。这时,该转帐请求的 Referer 值就会是转账按钮所在的页面的 URL,通常是以 bank.example 域名开头的地址。而如果黑客要对银行网站实施
CSRF 攻击,他只能在他自己的网站构造请求,当用户通过黑客的网站发送请求到银行时,该请求的 Referer 是指向黑客自己的网站。因此,要防御 CSRF 攻击,银行网站只需要对于每一个转账请求验证其 Referer 值,如果是以 bank.example 开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。

具体做法

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
String referer = request.getHeader("Referer");
if(!WebUtils.valideCSRFAddress(referer)) {
logger.error("=================referer===============" + referer);
return false;
}
}
public static String[] domainList= { "app.bank.example.com", "data.bank.example.com", "oss.bank.example.com", "bank.example.com", "www.hiifit.com", "www.hiifit.net" };

public static boolean valideCSRFAddress(String referer) {
if(StringUtils.isEmpty(referer)) {
return false;
}
if (referer.contains("?")) {
referer = referer.substring(0, referer.indexOf("?"));
}
URI referUri = null;
try {
referUri = new URI(referer);
} catch (Exception e) {
e.printStackTrace();
return false;
}
String domain = referUri.getHost().toLowerCase();
for (int i = 0; i < domainList.length; i++) {
if (domainList[i].toLowerCase().equals(domain)) {
return true;
}
}
return false;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: