摘录:

1.跨站点请求伪造

首先,什么是跨站点请求伪造?

跨站点请求伪造-CSRF(Cross Site Request Forgery):是一种网络攻击方式。

说的白话一点就是,别的站点伪造你的请求,最可怕的是你还没有察觉并且接收了。听起来确实比较危险,下面有个经典的实例,了解一下跨站点请求伪造到底是怎么是实现的,知己知彼。

受害者:Bob 黑客:Mal 银行:bank bob在银行有一笔存款,可以通过请求http://bank.example/withdraw?account=bob&amount=1000000&for=bob2把钱转到bob2下。通常情况下,该请求到达网站后,服务器会验证请求是否来自一个合法的session,并且该session的用户Bob已登录。Mal在该银行也有账户,于是他伪造了一个地址http://bank.example/withdraw?account=bob&amount=1000000&for=mal,但是如果直接访问,服务器肯定会识别出当前登录用户是mal而不是Bob,不能接受请求。于是通过CSRF攻击方式,将此链接伪造在广告下,诱使Bob自己点这个链接,那么请求就会携带Bob浏览起的cookie一起发送到银行,而Bob同时又登录了银行或者刚刚登录不久session还没有过期,那服务器发现cookie中有Bob的登录信息,就接收了响应,攻击就成功了

2.现在主要的几种防御CSRF的策略:

1. 验证Referer:

referer携带请求来源,从示例可以看出,受害者发送非法请求肯定不是在银行的界面,所以在服务器通过验证Referer是不是bank.example开始就可以了,这个方法简单粗暴。

最简单的实现就是加个Filter:

  1. /**
  2. * 根据请求地址获取token-key
  3. */
  4. public static String getTokenKey(HttpServletRequest request){
  5. String key = null;
  6. try {
  7. MessageDigest mDigest = MessageDigest.getInstance("MD5");//摘要算法可以自己选择
  8. byte[] result = mDigest.digest(request.getRequestURL().toString().getBytes());
  9. key = StringUtil.bytes2hex(result);
  10. } catch (NoSuchAlgorithmException e) {
  11. LOGGER.error("get token key failed",e);
  12. }
  13. return key
  14. }
  15. /**
  16. * 获取token-value并存储在session中
  17. */
  18. public static String getTokenValue(HttpServletRequest request){
  19. String key = getTokenKey(request);
  20. Map<String,String> tokenMap = null;
  21. Object obj = request.getSession().getAttribute("tokenMap");
  22. if(obj == null){
  23. tokenMap = new HashMap<String,String>();
  24. request.getSession().setAttribute("tokenMap", tokenMap);
  25. } else {
  26. tokenMap = (Map<String,String>)obj;
  27. }
  28. if(tokenMap.containsKey(key)){
  29. return tokenMap.get(key);
  30. }
  31. String value = GUID.generate();//GUID实现可自行百度,其实弄个伪随机数也是可以的...
  32. tokenMap.put(key,value);
  33. return value;
  34. }
  35. /**
  36. * 验证token
  37. */
  38. public static boolean verify(String key ,String value ,HttpServletRequest request){
  39. boolean result = false;
  40. if (StringUtil.isEmpty(key) || StringUtil.isEmpty(value)) {//key或value只要有一个不存在就验证不通过
  41. return result;
  42. }
  43. if (request.getSession() != null) {
  44. Map<String,String> tokenMap = getTokenMap(request);
  45. if(value.equals(tokenMap.get(key))){
  46. result = true;
  47. tokenMap.remove(key);//成功一次就失效
  48. }
  49. }
  50. return result;
  51. }

完成上边的工具方法后,需要在form中添加token,如下:

  1. <form name="frm" action="/test/tokentest.htm"  method="POST">
  2. <input type="hidden" name="token_key" value="<%=Token.getTokenKey(request) %>"/>
  3. <input type="hidden" name="token_value" value="<%=Token.getTokenValue(request) %>"/>
  4. ...
  5. </form>

验证可以放在Filter里也可以放在Service里,只要保证请求/test/tokentest.htm会先验证就行了。直接调用工具方法Token.verify()以下就不赘述了。

3. 在HTTP头中自定义属性并验证:

这个方法和上面那个类似,也是设置token,只是把token设置为HTTP头中的自定义属性。

通过XMLHttpRequest可以一次性给所有该类请求的HTTP头加上token 属性,但是XMLHttpRequest请求通常用于Ajax方法对局部页面的异步刷新,比较有局限性;而且通过XMLHttpRequest请求的地址不会被记录到浏览器的地址栏,一方面不会通过Referer泄露token,另一方面会导致前进,后退,刷新,收藏等操作失效,所以还是慎用。

虽然上面介绍了几种方法,但现在还没有一种完美的解决方案,但是通过Referer和Token方案结合起来使用,也能很得有效CSRF攻击。

跨站请求伪造攻击 CSRF的更多相关文章

  1. 安全性测试入门 (三):CSRF 跨站请求伪造攻击和防御

    本篇继续对于安全性测试话题,结合DVWA进行研习. CSRF(Cross-site request forgery):跨站请求伪造 1. 跨站请求伪造攻击 CSRF则通过伪装成受信任用户的请求来利用受 ...

  2. XSS跨站脚本攻击与CSRF跨站请求伪造攻击的学习总结(转载)

    转载自 https://blog.csdn.net/baidu_24024601/article/details/51957270 之前就了解过这方面的知识,但是没有系统地总结.今天在这总结一下,也让 ...

  3. CSRF(跨站请求伪造)攻击方式

    一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSR ...

  4. ASP.NET MVC 防止跨站请求伪造(CSRF)攻击的方法

    在HTTP POST请求中,我们多次在View和Controller中看下如下代码: View中调用了Html.AntiForgeryToken(). Controller中的方法添加了[Valida ...

  5. CSRF(跨站请求伪造攻击)漏洞详解

    Cross-Site Request Forgery(CSRF),中文一般译作跨站点 请求伪造.经常入选owasp漏洞列表Top10,在当前web漏洞排行中,与XSS和SQL注入并列前三.与前两者相比 ...

  6. 浅谈CSRF(跨站请求伪造)攻击方式

    一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSR ...

  7. SpringSecurity原理解析以及CSRF跨站请求伪造攻击

    SpringSecurity SpringSecurity是一个基于Spring开发的非常强大的权限验证框架,其核心功能包括: 认证 (用户登录) 授权 (此用户能够做哪些事情) 攻击防护 (防止伪造 ...

  8. 教你轻松解决CSRF跨站请求伪造攻击

    摘要:CSRF(Cross-site request forgery)跨站请求伪造,通过伪装来自受信任用户的请求来利用受信任的网站.与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也 ...

  9. Web安全测试之跨站请求伪造(CSRF)篇

    跨站请求伪造(即CSRF)被Web安全界称为诸多漏洞中“沉睡的巨人”,其威胁程度由此“美誉”便可见一斑.本文将简单介绍该漏洞,并详细说明造成这种漏洞的原因所在,以及针对该漏洞的黑盒测试与灰盒子测试具体 ...

随机推荐

  1. Android4.0新控件

    谷歌在推出Android4.0的同时推出了一些新控件,Android4.0中最常用的新控件有下面5种.  1. Switch的使用 Switch顾名思义,就是开关的意思,有开和关两种状态. 当Swit ...

  2. 2017noip普及组赛前注意事项总结

    petr 大神镇场 距人生第一场noip只差4天半了(好紧张) 总结几下四道题的做题策略 NO1 第一题一般是送分的,认真读题,别太草率,多想几遍再动手,把重要的地方圈一圈.画一画,自己找几个数据多试 ...

  3. 面试中的DNS

    DNS 当DNS客户机需要在程序中使用名称时,它会查询DNS服务器来解析该名称.客户机发送的每条查询信息包括三条信息:指定的DNS域名,指定的查询类型,DNS域名的指定类别. DNS基于UDP服务,端 ...

  4. oralce plsql案例练习

    以下plsql程序用的scott用户的dept,emp表. 案例1 --查询80,81,82,87年员工入职人数 set serveroutput on declare cursor cemp is ...

  5. 刚买个炼狱蝰蛇1800dpi的下完驱动提示没有发现鼠标

    2017-02-19补充:可以下载下面的程序 ,也可以访问 http://cn.razerzone.com/synapse/  下载雷云 也可解决问题 ------------------------ ...

  6. java存放数据的5个地方

    1.寄存器:最快的存储区,位于处理器内部,但是寄存器的数量极其有限,所以寄存器根据需求进行分配,你不 能直接控制,也不能在程序中感觉到寄存器存在的任何迹象.(C/C+允许向寄存器建议寄存器配, 但它不 ...

  7. notify丢失、虚假唤醒

    notify丢失: 假设线程A因为某种条件在条件队列中等待,同时线程B因为另外一种条件在同一个条件队列中等待,也就是说线程A/B都被同一个Object.wait()挂起,但是等待的条件不同. 现在假设 ...

  8. BZOJ 1998: [Hnoi2010]Fsk物品调度 [置换群 并查集]

    传送门 流水线上有n个位置,从0到n-1依次编号,一开始0号位置空,其它的位置i上有编号为i的盒子.Lostmonkey要按照以下规则重新排列这些盒子. 规则由5个数描述,q,p,m,d,s,s表示空 ...

  9. BZOJ 1898: [Zjoi2005]Swamp 沼泽鳄鱼 [矩阵乘法]

    1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1082  Solved: 602[Submit][S ...

  10. Win10无法使用小娜搜索本地应用问题的解决方案

    小娜介绍 win10的Cortana小娜是一个功能非常强大的语音和搜索助手,用户可以通过小娜助手搜索任意的文件和应用软件,不过有用户发现win10的小娜搜索不到已安装的本地软件,那么win10小娜助手 ...