XSS与CSRF攻击防御概念
2017-03-04 15:53
288 查看
先看这两篇文章:XSS攻击原理及防御措施 CSRF攻击介绍及防御
CSRF攻击:攻击者盗用了你的身份信息,以你的名义发送恶意请求。带来的后果就是:个人隐私泄露以及财产安全。
CSRF攻击的思想:
1、登录受信任网站A,并在本地生成Cookie;
2、在不登出A的情况下,访问危险网站B;
3、B要求访问第三方站点A,发出一个请求;
4、根据B的请求,浏览器带着1产生的Cookie访问A;
5、A不知道4中的请求是A发出的还是B发出的,A直接根据用户的权限处理请求,这样B就达到了模拟用户操作的目的。
根据 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 攻击,拒绝该请求。
攻击概念
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; }
相关文章推荐
- XSS 攻击的概念及防御
- 浅析XSS和CSRF攻击及防御
- XSS 和 CSRF 攻击的一些非常规防御方法
- XSS 和 CSRF 攻击
- Spring MVC防御CSRF、XSS和SQL注入攻击
- CSRF攻击与防御
- CSRF攻击与防御(写得非常好)
- CSRF—攻击与防御
- CSRF攻击与防御策略
- CSRF攻击与防御(写得非常好)
- 内容安全策略(CSP)_防御_XSS_攻击的好助手
- 防御 XSS 攻击的七条原则
- CSRF攻击与防御
- CSRF攻击与防御
- Spring MVC防御CSRF、XSS和SQL注入攻击 一
- Spring MVC防御CSRF、XSS和SQL注入攻击
- Spring mvc拦截器防御CSRF攻击
- CSRF攻击介绍及防御
- CSRF学习笔记之CSRF的攻击与防御以及审计【00x1 】
- 0124 WEB安全实战(三)XSS 攻击的防御【基础】