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:

/*** 根据请求地址获取token-key*/
public static String getTokenKey(HttpServletRequest request){String key = null;try {MessageDigest mDigest = MessageDigest.getInstance("MD5");//摘要算法可以自己选择byte[] result = mDigest.digest(request.getRequestURL().toString().getBytes());key = StringUtil.bytes2hex(result);} catch (NoSuchAlgorithmException e) {LOGGER.error("get token key failed",e);} return key
}/*** 获取token-value并存储在session中*/
public static String getTokenValue(HttpServletRequest request){String key = getTokenKey(request);Map<String,String> tokenMap = null;Object obj = request.getSession().getAttribute("tokenMap");if(obj == null){tokenMap = new HashMap<String,String>();request.getSession().setAttribute("tokenMap", tokenMap);} else {tokenMap = (Map<String,String>)obj;}if(tokenMap.containsKey(key)){return tokenMap.get(key);}String value = GUID.generate();//GUID实现可自行百度,其实弄个伪随机数也是可以的...tokenMap.put(key,value);return value;
}/*** 验证token*/
public static boolean verify(String key ,String value ,HttpServletRequest request){boolean result = false;if (StringUtil.isEmpty(key) || StringUtil.isEmpty(value)) {//key或value只要有一个不存在就验证不通过return result;}if (request.getSession() != null) {Map<String,String> tokenMap = getTokenMap(request);if(value.equals(tokenMap.get(key))){result = true;tokenMap.remove(key);//成功一次就失效}}return result;
}

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

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

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

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

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

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

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

Http跨站点请求伪造解决方案相关推荐

  1. web客户端安全之跨站点请求伪造攻击

    CSRF攻击,Cross-site request forgery,跨站点请求伪造,也被称为"One Click Attack"或者Session Riding,通常缩写为CSRF ...

  2. 【burpsuite安全练兵场-客户端12】跨站点请求伪造CSRF-12个实验(全)

    前言: 介绍: 博主:网络安全领域狂热爱好者(承诺在CSDN永久无偿分享文章). 殊荣:CSDN网络安全领域优质创作者,2022年双十一业务安全保卫战-某厂第一名,某厂特邀数字业务安全研究员,edus ...

  3. Django中如何防范CSRF跨站点请求伪造攻击

    CSRF概念 CSRF跨站点请求伪造(Cross-Site Request Forgery). 攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望 ...

  4. 跨站点请求伪造_十大常见web漏洞——跨站点请求伪造(CSRF)

    CSRF介绍 什么是CSRF呢?我们直接看例子. https://mp.toutiao.com/profile_v3/graphic/preview?do=delete&pgc_id=6829 ...

  5. java跨站点脚本编制_跨站点请求伪造 跨站点脚本编制 通过框架钓鱼漏洞 | 学步园...

    1.跨站点请求伪造 跨站点脚本编制 通过框架钓鱼漏洞 主要是通过在url或参数中添加脚本如: 1.URL中添加 2.参数value=. 添加一个过滤器对特殊字符进行拦截 package com.xxx ...

  6. 持续集成部署Jenkins工作笔记0021---21.关闭防止跨站点请求伪造

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 因为git的钩子上,并没有要求,说要带着jekins-crumb那个消息头,所以这里需要关闭这个 ...

  7. security框架工作笔记002---CSRF跨站点请求伪造(Cross—Site Request Forgery)_理解和防御

    JAVA技术交流QQ群:170933152  CSRF概念:CSRF跨站点请求伪造(Cross-Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:   ...

  8. 我要学ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击

    我要学ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击 概述      众所周知,ASP.Net MVC程序在浏览器运行时产生了标准的Html标签,包括 ...

  9. 一文带你学习跨站点请求伪造(CSRF)

    一文带你学习跨站点请求伪造(CSRF) 1.何为CSRF 2.浏览器的Cookie策略 3.P3P头的副作用 4.CSRF攻击流程 5.CSRF的分类 GET型 POST-表单型 POST-JSON型 ...

最新文章

  1. 编程软件python下载怎么读-怎么学python编程语言,他说,你需要这个工具
  2. 经常会提到的Java面试题
  3. Mac终端Terminal使用
  4. hash表与系统顺序寻址
  5. 今天看明白了,为什么有些属性会这样写了:public string status{get;set;}
  6. if shell 条件语句简写_Shell if条件判断语句用法详解
  7. 查看Full GC方法:1,jconsel:2,linux 命令: jstat -gcutil id 4s 10003,linux 命令(前提有.gc日志):c
  8. ROS笔记(32) MoveIt!关节控制器
  9. CSDN中最全python字典和实例,让你轻松掌握
  10. 【Elasticsearch】Elasticsearch 缓存策略 QueryCacheingPolicy
  11. [转帖]Windows 上面IE的历史
  12. 【TSP】基于matlab遗传算法求解13城市旅行商问题【含Matlab源码 1255期】
  13. 【转】无线路由器密码破解
  14. android大智慧安装目录,大智慧的文件目录结构
  15. 国产系统银河麒麟(龙芯MIPS)远程访问自研windows程序
  16. 对堆区、栈区、全局静态区的理解
  17. 树莓派安装Ubuntu server无屏幕开机自动连接WIFI
  18. Unity摄像头仿真调研(svl)
  19. Android 一体机研发之修改系统设置————声音
  20. 软件工程导论第六版 第一章 软件工程学概述知识点总结(下)

热门文章

  1. C# Math类的常用方法
  2. bitmina mysql root密码_sysbench压测自装MySQL数据库
  3. Chrome关闭侧边栏
  4. OpenDaylight-Boron学习笔记: 4 OVSDB模块
  5. STM32内部flash详解(1)
  6. Dapper 下划线
  7. linux时间 站长之,Linux之父:Intel别浪费时间在AVX512这类指令集、多堆核心才是正道...
  8. 【IC设计】异步FIFO
  9. 轻流整体调研-v 1.0
  10. Kaggle - Home Depot Product Search Relevance 基础篇