web csrf java

跨站点请求伪造攻击(CSRF)在Web应用程序中非常常见,如果允许,可能会造成重大危害。 如果您从未听说过CSRF,建议您查看有关它的OWASP页面 。
幸运的是,阻止CSRF攻击非常简单,我将向您展示它们的工作方式,以及如何在基于Java的Web应用程序中以尽可能不干扰的方式防御它们。
想象一下,您将要在银行的安全网页上进行汇款,当您单击转帐选项时,将加载一个表格页面,该页面允许您选择借方和贷方帐户,并输入要转移的金额。 当您对选择满意后,请按“提交”,然后将表格信息发送到银行的网络服务器,该服务器依次执行交易。
现在,将以下内容添加到图片中,一个恶意网站(您认为当然没有害处)在浏览器的另一个窗口/选项卡上打开,而您无辜地在银行站点中移动了数百万美元。 这个邪恶的网站了解银行的网络表单结构,当您浏览该网站时,它会尝试发布从您的账户中提取资金并将其存入邪恶的霸主账户的交易,之所以能够做到这一点,是因为您与银行进行了公开且有效的交易银行网站使用同一浏览器! 这是CSRF攻击的基础。
一种简单有效的预防方法是在加载初始传输表单时生成一个随机(即不可预测)字符串并将其发送给浏览器。 然后,浏览器将这些数据与传输选项一起发送,服务器在批准交易进行处理之前对其进行验证。 这样,恶意网站即使可以访问浏览器中的有效会话也无法发布交易。
为了在Java中实现此机制,我选择使用两个过滤器,一个用于为每个请求创建盐,另一个用于验证它。 由于用户请求以及随后应验证的POST或GET不一定按顺序执行,因此我决定使用基于时间的缓存来存储有效盐字符串列表。
用于为请求生成新的盐并将其存储在缓存中的第一个过滤器可以编码如下:
package com.ricardozuasti.csrf;import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import java.io.IOException;
import java.security.SecureRandom;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.RandomStringUtils;public class LoadSalt implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// Assume its HTTPHttpServletRequest httpReq = (HttpServletRequest) request;// Check the user session for the salt cache, if none is present we create oneCache<String, Boolean> csrfPreventionSaltCache = (Cache<String, Boolean>)httpReq.getSession().getAttribute("csrfPreventionSaltCache");if (csrfPreventionSaltCache == null){csrfPreventionSaltCache = CacheBuilder.newBuilder().maximumSize(5000).expireAfterWrite(20, TimeUnit.MINUTES).build();httpReq.getSession().setAttribute("csrfPreventionSaltCache", csrfPreventionSaltCache);}// Generate the salt and store it in the users cacheString salt = RandomStringUtils.random(20, 0, 0, true, true, null, new SecureRandom());csrfPreventionSaltCache.put(salt, Boolean.TRUE);// Add the salt to the current request so it can be used// by the page rendered in this requesthttpReq.setAttribute("csrfPreventionSalt", salt);chain.doFilter(request, response);}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void destroy() {}
}
我使用Guava CacheBuilder创建盐缓存,因为它既有大小限制,又有每个条目的过期超时。 为了生成实际的盐,我使用了由Java 6 SecureRandom支持的Apache Commons RandomStringUtils ,以确保生成强大的种子。
在以AJAX链接,发布或调用安全交易的页面结尾的所有请求中均应使用此过滤器,因此在大多数情况下,将其映射到每个请求是一个好主意(也许除了静态内容(例如图像) ,CSS等)。 您的web.xml中的映射应类似于:
...<filter><filter-name>loadSalt</filter-name><filter-class>com.ricardozuasti.csrf.LoadSalt</filter-class></filter>...<filter-mapping><filter-name>loadSalt</filter-name><url-pattern>*</url-pattern></filter-mapping>...

就像我说的,要在执行安全交易之前验证盐,我们可以编写另一个过滤器:

package com.ricardozuasti.csrf;import com.google.common.cache.Cache;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;public class ValidateSalt implements Filter  {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// Assume its HTTPHttpServletRequest httpReq = (HttpServletRequest) request;// Get the salt sent with the requestString salt = (String) httpReq.getParameter("csrfPreventionSalt");// Validate that the salt is in the cacheCache<String, Boolean> csrfPreventionSaltCache = (Cache<String, Boolean>)httpReq.getSession().getAttribute("csrfPreventionSaltCache");if (csrfPreventionSaltCache != null &&salt != null &&csrfPreventionSaltCache.getIfPresent(salt) != null){// If the salt is in the cache, we move onchain.doFilter(request, response);} else {// Otherwise we throw an exception aborting the request flowthrow new ServletException("Potential CSRF detected!! Inform a scary sysadmin ASAP.");}}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void destroy() {}
}
您应该为每个需要确保安全的请求(例如,检索或修改敏感信息,转移资金等)配置此过滤器,例如:
...<filter><filter-name>validateSalt</filter-name><filter-class>com.ricardozuasti.csrf.ValidateSalt</filter-class></filter>...<filter-mapping><filter-name>validateSalt</filter-name><url-pattern>/transferMoneyServlet</url-pattern></filter-mapping>...
在配置完两个servlet之后,所有受保护的请求都将失败:)。 要解决此问题,您必须在每个以安全URL结尾的链接和表单帖子中添加csrfPreventionSalt参数,该参数包含具有相同名称的request参数的值。 例如,在JSP页面内以HTML形式:
...
<form action="/transferMoneyServlet" method="get"><input type="hidden" name="csrfPreventionSalt" value="<c:out value='${csrfPreventionSalt}'/>"/>...
</form>
...

当然,您可以编写一个自定义标签,一个不错的Javascript代码,或在每个所需的链接/表单中添加新参数的方法。

参考: Ricardo Zuasti博客博客上的JCG合作伙伴 Ricardo Zuasti 阻止了Java Web应用程序中的CSRF 。

翻译自: https://www.javacodegeeks.com/2012/06/preventing-csrf-in-java-web-apps.html

web csrf java

web csrf java_在Java Web应用程序中阻止CSRF相关推荐

  1. 在Java Web应用程序中阻止CSRF

    跨站点请求伪造攻击(CSRF)在Web应用程序中非常常见,如果允许,可能会造成重大危害. 如果您从未听说过CSRF,建议您查看有关它的OWASP页面 . 幸运的是,阻止CSRF攻击非常简单,我将向您展 ...

  2. Oracle的Web控制台端口,Oracle Java Web Console(概述)

    Oracle Java Web Console(概述) Oracle Java Web Console 为用户访问基于 Web 的系统管理应用程序提供了一个公用位置.可以使用所支持的几种 Web 浏览 ...

  3. ASP.NET Core与Dapper和VS 2017使用JWT身份验证WEB API并在Angular2客户端应用程序中使用它

    目录 介绍 背景 步骤1 创建ASP.NET Core Web API项目 Fitness.JWT.API项目说明 使用代码 startup.cs JwtIssuerOptions.cs JwtCon ...

  4. Spring MVC,Thymeleaf,Spring Security应用程序中的CSRF保护

    跨站点请求伪造(CSRF)是一种攻击,它迫使最终用户在当前已通过身份验证的Web应用程序上执行不需要的操作. 如果您使用Spring Security 3.2及更高版本,在Spring MVC / T ...

  5. 使用tinylog 1.1改进您在Java EE应用程序中的登录

    tinylog是Java的轻量级日志记录框架. 与Apache Log4j和Logback相反,tinylog由仅80KB的单个JAR文件组成,没有任何依赖性,并且具有静态logger类. 这意味着您 ...

  6. java application pdf_從Java應用程序中即時打開PDF文件

    Is there any way to have a code that opens a PDF file in Java application in a platform independant ...

  7. java web源代码_检测Java Web应用程序而无需修改其源代码

    java web源代码 与其他系统进行交互时,大多数Java Web应用程序都使用标准Java接口. 诸如Web页面或REST服务器之类的基于HTTP的服务是使用接口javax.servlet.Ser ...

  8. java web 自定义标签_如何在JavaWeb程序中使用自定义标签

    展开全部 tld定义格式32313133353236313431303231363533e78988e69d8331333361323566 [java] view plain copy print? ...

  9. 体育馆预约系统java_基于JAVA WEB的高校体育场地预约管理系统(计算机毕业设计)...

    项目类型:JAVA WEB项目 项目名称:高校体育场地预约管理系统 用户类型:三种角色(老师+学生+管理员) 难度:7 项目技术:spring+struuts+jsp+jquery+hibernate ...

最新文章

  1. 格式工厂软件处理视频
  2. win服务器系统程序原因
  3. 【教程】Linux 系统下对目录扩容的方法
  4. mongodb 3.4 安装_Python数据分析及可视化实例之CentOS7.2+MongoDB V3.4 安装
  5. 看一下iFM最新文章
  6. [Javascript] Avoid Creating floats if they are not needed
  7. gitlab中的CI
  8. 配置汇编环境:使用vs2010+MASM
  9. UTC时间与当地时间的转换关系?
  10. 台式电脑屏幕怎么调亮度_电脑屏幕亮度到底怎么调才最好?
  11. BZOJ 2466 [中山市选2009]树(高斯消元)
  12. Spring定时器corn表达式详解
  13. Java源文件编译出错:类文件包含错误的类 请删除该文件或确保文件位于正确的类路径子目录中
  14. docker compose自定义IP报错ERROR: Pool overlaps with other one on this address space
  15. 使用两个路由器级连实现共用一个宽带
  16. 申请一个微信小程序有哪些需要注意的事项
  17. 小数的二进制与十进制转换
  18. 深度丨详解 Amazon Go 三大核心技术
  19. JAVA获得股票数据大全
  20. python data PDAdata pivot table ,group by, contains, starts with

热门文章

  1. Java对象引用四个级别(强、软、弱、虚)
  2. 【php】正则无法截取\反斜杠的解决方法
  3. 走的走的居然飞起来了……
  4. 你们好好的学,回头教教我~
  5. Ajax基本案例详解之$.ajax的实现
  6. 数组的初始化与默认值
  7. JS中遍历数组的两种方式
  8. 2015蓝桥杯省赛---java---B---7(牌型种数)
  9. mysql 外键和事务_Mysql (五)事务和外键
  10. spring javafx_Oracle Spring Clean JavaFX应该吗?