首页 > 学院 > 开发设计 > 正文

XSS与CSRF攻击防御概念

2019-11-06 07:39:22
字体:
来源:转载
供稿:网友

先看这两篇文章: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 攻击,拒绝该请求。

具体做法

@Overridepublic 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;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表