web csrf java_在Java Web应用程序中阻止CSRF

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 安全性知识要点

添加、删除用户 1.添加用户 可以使用CREAT USER语法添加一个或多个用户&#xff0c;并设置相应的密码。 语法格式&#xff1a; CREAT USER user [IDENTIFIED BY [PASSWORD] password] [,user [IDENTIFIED BY [PASSWORD] password] ] ... 其中&#xff0c;user的格式为&…

在WildFly的REST Web服务中与Jackson的双向关系

这是使用Jackson的REST Web服务中Java实体之间的双向关系的示例。 假设我们在两个实体Parent和Child之间存在双向关系。 使用MySQL工作台为这两个表生成SQL模式文件。 DROP SCHEMA IF EXISTS bidirectional_schema ; CREATE SCHEMA IF NOT EXISTS bidirectional_schema DEFA…

ICMP Internet控制报文协议

ICMP报文主要有两大功能&#xff1a;查询报文和差错报文。转载于:https://www.cnblogs.com/gardenofhu/p/8027431.html

Postman安装与使用(网络请求神器)--post、get请求

安装 1、Postman最早是作用chrome浏览器插件存在的&#xff0c;所以&#xff0c;你可以到chrome商店搜索下载安装&#xff0c;因为重所周知的原因&#xff0c;所以&#xff0c;大家都会找别人共享的postman插件文件来安装。由于2018年初Chrome停止对Chrome应用程序的支持。 官…

c# 对象 类

类定义中可以使用的访问修饰符组合none or internal 类只能在当前工程中访问public 类可以在任何地方访问abstract or internal abstract 类只能在当前工程中访问&#xff0c;不能实例化&#xff0c;只能继承public abstract 类可以在任何地方访问&#xff0c;不能实例化&#…

openshift用户管理_OpenShift Express Web管理控制台:入门

openshift用户管理本周&#xff0c; 最新版本的OpenShift为已经很棒的PaaS Cloud提供商带来了两个非常好的功能。 首先&#xff0c;JBoss AS已从7.0升级到7.1&#xff0c;并且所有新的Express Web Management Console已作为预览发布。 在本文中&#xff0c;我们将研究如何使用此…

linux系统搭建ftp服务器--只给某个用户访问其默认目录下的文件

1、环境: window操作系统中安装FlashFXP 软件或xftp&#xff1b; 服务器端的操作系统为centos8&#xff1b; 2、检查安装vsftpd软件 查看所有的安装的软件包 并在结果中查找包含vsftp 的文件 rpm -qa | grep vsftpd如果没有装则使用yum命令安装 yum -y install vsftpd3、创…

12月13日 什么是help_method,session的简单理解, find_by等finder method

helper_methodDeclare a controller method as a helper. For example, helper_method :link_todef link_to(name, options) … end makes the link_to controller method available in the view.课程遇到的如current_cart,current_user. 声明后&#xff0c;就可以在view里面使…

Openshift源中的高可用性Drools无状态服务

嗨&#xff0c;大家好&#xff01; 在这篇博客文章中&#xff0c;我想举一个简单的例子&#xff0c;展示使用Openshift 3&#xff08;Docker和Kubernetes&#xff09;扩展Drools Stateless服务有多么容易。 我将展示如何通过按需提供新实例来扩展我们的服务&#xff0c;以及如何…

FTP配置文件详解vsftpd.conf

FTP配置文件详解vsftpd.conf 转载过来做个笔记&#xff0c;原文地址&#xff1a;https://blog.csdn.net/miss520jenny/article/details/92664533 #vi /etc/vsftpd/vsftpd.conf 1&#xff0e;登录和对匿名用户的设置 write_enableYES //是否对登录用户开启写权限。属全局性设…

Visual C++中MFC消息的分类

Visual C中MFC消息的分为三类&#xff1a;标准(窗口)消息、命令消息、控件消息。 1、标准(窗口)消息&#xff1a;窗口消息一般与窗口内部运作有关&#xff0c;如创建窗口&#xff0c;绘制窗口&#xff0c;销毁窗口&#xff0c;通常&#xff0c;消息是从系统发到窗口&#xff0c…

为什么配置了vsftpd.conf文件,用户还是可以访问上级目录?

因为选择的连接类型是 SFTP over SSH 所以访问的是 sftp服务器&#xff0c;sftp的配置文件中没对该用户限制根目录&#xff0c;所以可以访问上一级目录。但是&#xff0c;还是不可以写入了&#xff0c;除了该用户的目录文件&#xff0c;其他文件都是只读。 修改 /etc/ssh/sshd…

来呀,快活呀。iOS 超级码农群:538549344

特大喜讯&#xff1a; iOS开发的小伙伴们&#xff0c;咱们有群了 iOS 超级码农交流群&#xff1a; 538549344 建群源于最近好多人加我QQ交流技术问题&#xff0c;有时忙于工作无法及时回复&#xff0c;为了大家的问题能及时得到解答&#xff0c;还是建个群&#xff0c;群里很多…

jpa jsf_完整的Web应用程序Tomcat JSF Primefaces JPA Hibernate –第1部分

jpa jsf我们创建了这篇文章&#xff0c;将展示如何使用以下工具创建完整的Web应用程序&#xff1a;Tomcat7&#xff0c;带有Primefaces的JSF2&#xff08;Facelets和Libraries&#xff09;&#xff08;具有AutoComplete&#xff09;&#xff0c;JPA / Hibernate&#xff08;具有…

前端性能优化:Add Expires headers

合理设置 HTTP缓存 缓存的力量是强大的&#xff0c;恰当的缓存设置可以大大的减少 HTTP请求。 很少变化的图片资源可以直接通过 HTTP Header中的Expires设置一个很长的过期头 ;变化不频繁而又可能会变的资源可以使用 Last-Modifed来做请求验证。 &#xff08;1&#xff09;Apa…

错题

1. 本题考查String对象的声明和赋值方式。C#中没有new String() 这种方式来构造字符串。故选 AC 2. 在CSS中&#xff0c;控制列表样式的属性有&#xff1a;list-style-type&#xff0c;list-style-position&#xff0c;list-style-image&#xff0c;list-style equals比较的是像…

通过微调JVM Garbage Collector减少Java IDE滞后

有没有想过为什么Eclipse / Netbeans会一直暂停一段时间&#xff1f; 特别是在您想向亲爱的同事展示代码中的内容时&#xff1f; 感觉很尴尬和尴尬&#xff0c;不是吗&#xff1f; 我发现大多数时间由于垃圾收集器的执行而导致IDE暂停。 JVM设计中的微妙元素很少起作用&#x…

centos8部署nginx

Nginx 部署 1.创建 www用户&#xff0c; UID、GID 皆是 501&#xff0c;通过cat /etc/passwd&#xff0c;检查是否存在www用户 ~]# groupadd -g 501 www ~]# useradd -u 501 -g www www ~]# cat /etc/passwd 2.下载相应版本 ~]# wget http://nginx.org/download/nginx-1.16…

javascript-发布订阅模式

说明&#xff1a;本篇文章转载自小火柴的蓝色理想的一篇博文。原文地址&#xff1a;http://www.cnblogs.com/xiaohuochai/p/8031564.html 发布—订阅模式又叫观察者模式&#xff0c;它定义对象间的一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖…

centos8部署Django项目---后台运行

参考&#xff1a;https://www.cnblogs.com/yoyoketang/p/10220941.html 一、安装 pip install django创建项目 django-admin startproject mysite打开项目配置settings.py文件 cd mysite/mysitesettings.py文件&#xff08; DEBUG TrueALLOWED_HOSTS [127.0.0.1, localh…