java网页程序采用 spring 防止 csrf 攻击.
By:Roy.LiuLast updated:2013-10-22
经常开发银行的应用,在安全性方面要求比较高,在安全性保护方面,csrf 攻击是必须测试的项目之一,关于什么是 csrf 攻击,我不想多做解释,网上已经介绍够多了,可以参看 IBM Developer works 的文章 http://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/ 这篇文章介绍了 csrf 的危害和一般解决办法,在实际开发过程中,有一些参考价值。
但事实上在我经历过的银行项目开发过程中,基本都会采用 spring 框架,所以完全可以不用自己开发 filter 去拦截 csrf 攻击的请求,而直接采用实现 spring 提供的 HandlerInterceptor 来实现。 从本质上来说,这也是一个 filter. 我这里就直接实现它来 防止 csrf 攻击.
基本思路:
1. 用户登录之后,后台程序生产一个 csrftoken 的 token ,放在 cookies 中,并且记录在 session 中。
2. 当客户端发出请求的访问后台程序的时候,经过自己实现的HandlerInterceptor 来拦截.
3. 拦截的基本方法是检查请求的参数中是否有csrftoken ,并检查这个值,是否合法有效(不为空,并且得到的参数等于cookies 中保存的值,而且还要等于session 中的值,那么就是合法的)
直接上代码,需要相关 spring 的jar 包,自己可以准备好,代码如下:
这样就可以实现在 j2ee 应用中拦截 csrf 攻击了。
但事实上在我经历过的银行项目开发过程中,基本都会采用 spring 框架,所以完全可以不用自己开发 filter 去拦截 csrf 攻击的请求,而直接采用实现 spring 提供的 HandlerInterceptor 来实现。 从本质上来说,这也是一个 filter. 我这里就直接实现它来 防止 csrf 攻击.
基本思路:
1. 用户登录之后,后台程序生产一个 csrftoken 的 token ,放在 cookies 中,并且记录在 session 中。
2. 当客户端发出请求的访问后台程序的时候,经过自己实现的HandlerInterceptor 来拦截.
3. 拦截的基本方法是检查请求的参数中是否有csrftoken ,并检查这个值,是否合法有效(不为空,并且得到的参数等于cookies 中保存的值,而且还要等于session 中的值,那么就是合法的)
直接上代码,需要相关 spring 的jar 包,自己可以准备好,代码如下:
package com.yihaomen.intercepter; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class CsrfIntercepter implements HandlerInterceptor { public static final String CSRFNUMBER = "csrftoken" ; public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception { String keyFromRequestParam = (String) request.getParameter(CSRFNUMBER); String keyFromCookies= "" ; boolean result= false ; Cookie[] cookies = request.getCookies(); if (cookies!= null ){ for ( int i = 0 ; i < cookies.length; i++) { String name = cookies[i].getName(); if (CSRFNUMBER.equals(name) ) { keyFromCookies= cookies[i].getValue(); } } } if ((keyFromRequestParam!= null && keyFromRequestParam.length()> 0 && keyFromRequestParam.equals(keyFromCookies) && keyFromRequestParam.equals((String)request.getSession().getAttribute(CSRFNUMBER)))) { result= true ; } else { request.getRequestDispatcher( "/error/400" ).forward(request, response); } return result; } public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { } public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { } } |
这样就可以实现在 j2ee 应用中拦截 csrf 攻击了。
From:一号门
Previous:Django 中 如何使用 settings.py 中的常量
RELATED ARTICLES
- java获取文件扩展名的误区
- java航空订票系统
- JAVA性能监控与调优参考文档链接
- Spring boot 读取配置文件properties
- Spring boot 非web版(jar)入门配置程序-maven工程源码
- Spring4 + Quartz Scheduler 执行定时任务例子
- Spring mvc @PathVariable 得到的参数包含点号的处理办法
- 同时绑定 spring validator和hibernate validator作为校验
- Spring security method 方法级别的权限控制
- spring mvc controller间跳转 重定向 传参数的几种方式
- 利用annotation与AOP对任何方法实现拦截. 附源码下载
- 在spring中常被忽视的注解 @Primary
- google authenticator 一次性验证码TOTP java 代码实现
- JAVA https ssl 连接验证服务端证书
- 在servlet中用spring @Autowire 注入.
- Java里各种路径的区别:getPath(), getCanonicalPath()
- java编译的包兼容性问题Unsupported Major.Minor Version 51.0
- Java 根据年号和第几周得到开始时间和结束时间
- Spring MVC 返回 xml 数据的配置方法
- Java8来了,回顾一下Java7的一些特性.
COMMENTS