- 浏览: 1064085 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (501)
- dwr (6)
- javascript (84)
- oracle (66)
- jsp/servlet (18)
- ant (3)
- 基础知识 (12)
- EXT (10)
- My SQL (10)
- java (71)
- spring (37)
- 学习的对象 (2)
- Linux (24)
- 面试 (1)
- HTML/CSS (11)
- tomcat (11)
- 收藏夹 (2)
- Power Designer (2)
- struts.xml配置文件 (1)
- sturts2 (3)
- myeclipse (8)
- eclipse (7)
- Maven (34)
- SVN (3)
- SAP JCO (2)
- JBOSS (11)
- webservice (8)
- word (1)
- 敏捷开发 (1)
- sybase (4)
- Nexus (3)
- EhCache (3)
- log4j (3)
- Cookie (4)
- Session (4)
- CXF (7)
- AXIS (2)
- SSO (1)
- LDAP (1)
- velocity (2)
- Jquery (5)
- redis (2)
- http (4)
- dojo (1)
- Linux资源监控软件mnon的安装与运用 (1)
- notepad++ (1)
- EA (1)
- UML (1)
- JasperReports (1)
- 权限 (0)
- freemarker (4)
- Spring MVC (1)
- JMS (1)
- activeMQ (1)
- hession (3)
- 安全 (1)
- ibatis (2)
- log (1)
- nginx (1)
最新评论
-
winhbb:
我刚好遇到了一个问题(在可以依赖注入的场合有效):有两个模块A ...
解决Maven项目相互依赖/循环依赖/双向依赖的问题 -
nanjiwubing123:
long3ok 写道你好 XmlOutputFormatter ...
用XStream转换复杂XML -
zhoujianboy:
另外一个方法实现eclipse tomcat 热部署:http ...
eclipse下实现maven项目在tomcat容器热部署方法 -
long3ok:
你好 XmlOutputFormatter 请问这个类是在什么 ...
用XStream转换复杂XML -
ganbo:
总结的好,文章给力。
解决Maven项目相互依赖/循环依赖/双向依赖的问题
package com.uncle5.pubrub.web.common; import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; public final class CsrfTokenManager { // 隐藏域参数名称 static final String CSRF_PARAM_NAME = "CSRFToken"; // session中csrfToken参数名称 public static final String CSRF_TOKEN_FOR_SESSION_ATTR_NAME = CsrfTokenManager.class .getName() + ".tokenval"; private CsrfTokenManager() { }; // 在session中创建csrfToken public static String createTokenForSession(HttpSession session) { String token = null; synchronized (session) { token = (String) session .getAttribute(CSRF_TOKEN_FOR_SESSION_ATTR_NAME); if (null == token) { token = UUID.randomUUID().toString(); session.setAttribute(CSRF_TOKEN_FOR_SESSION_ATTR_NAME, token); } } return token; } public static String getTokenFromRequest(HttpServletRequest request) { return request.getParameter(CSRF_PARAM_NAME); } }
package com.uncle5.pubrub.web.common; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Component; import org.springframework.web.servlet.support.RequestDataValueProcessor; import com.google.common.collect.Maps; @Component("requestDataValueProcessor") public class CsrfRequestDataValueProcessor implements RequestDataValueProcessor { @Override public String processAction(HttpServletRequest request, String action) { // TODO 暂时原样返回action return action; } @Override public String processFormFieldValue(HttpServletRequest request, String name, String value, String type) { // TODO 暂时原样返回value return value; } @Override public Map<String, String> getExtraHiddenFields(HttpServletRequest request) { //此处是当使用spring的taglib标签<form:form>创建表单时候,增加的隐藏域参数 Map<String, String> hiddenFields = Maps.newHashMap(); hiddenFields.put(CsrfTokenManager.CSRF_PARAM_NAME, CsrfTokenManager.createTokenForSession(request.getSession())); return hiddenFields; } @Override public String processUrl(HttpServletRequest request, String url) { // TODO 暂时原样返回url return url; } }
package com.uncle5.pubrub.web.security; import java.net.URLEncoder; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.StringUtils; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import com.uncle5.pubrub.web.common.CsrfTokenManager; import com.uncle5.pubrub.web.common.WebUser; public class CsrfInterceptor extends HandlerInterceptorAdapter { private static final Logger logger = LoggerFactory .getLogger(CsrfInterceptor.class); @Autowired WebUser webUser; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if ("POST".equalsIgnoreCase(request.getMethod())) { String CsrfToken = CsrfTokenManager.getTokenFromRequest(request); if (CsrfToken == null || !CsrfToken.equals(request.getSession().getAttribute( CsrfTokenManager.CSRF_TOKEN_FOR_SESSION_ATTR_NAME))) { String reLoginUrl = "/login?backurl=" + URLEncoder.encode(getCurrentUrl(request), "utf-8"); response.sendRedirect(reLoginUrl); return false; } } return true; } private String getCurrentUrl(HttpServletRequest request) { String currentUrl = request.getRequestURL().toString(); if (!StringUtils.isEmpty(request.getQueryString())) { currentUrl += "?" + request.getQueryString(); } return currentUrl; } }
<!-- 安全拦截用的 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/forum/post" /> <mvc:mapping path="/forum/reply/*" /> <bean class="com.uncle5.pubrub.web.security.CsrfInterceptor" /> </mvc:interceptor> </mvc:interceptors>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<div style="margin: 0 auto; border: 1px solid orange; width: 80%; height: 400px;"> <form:form action="/forum/post" method="post"> <span>标题:</span><input type="text" name="title" id="title"> <textarea name="content" id="content" rows="30" cols="40"></textarea> <input type="submit" name="submit" value="submit"> </form:form> </div>
<div style="margin: 0 auto; border: 1px solid orange; width: 80%; height: 400px;"> <form id="command" action="/forum/post" method="post"> <span>标题:</span><input type="text" name="title" id="title"> <textarea name="content" id="content" rows="30" cols="40"></textarea> <input type="submit" name="submit" value="submit"> <input type="hidden" name="CSRFToken" value="35afec82-da7b-449e-9ae9-b38664b5af63" /> </form> </div>
1.只有当使用spring的form标签时候,才会在渲染jsp页面时候触发
org.springframework.web.servlet.tags.form.FormTag 类中的
@Override
public int doEndTag() throws JspException {
RequestDataValueProcessor processor = getRequestContext().getRequestDataValueProcessor();
ServletRequest request = this.pageContext.getRequest();
if ((processor != null) && (request instanceof HttpServletRequest)) {
writeHiddenFields(processor.getExtraHiddenFields((HttpServletRequest) request));
}
this.tagWriter.endTag();
return EVAL_PAGE;
}
该方法会调用上文中所说的CsrfRequestDataValueProcessor中的创建隐藏域的方法getExtraHiddenFields来创建csrfToken隐藏域。
2.对相关需要进行防范csrf攻击的post请求地址进行拦截,此处是依赖springMVC中提供的拦截器机制来操作的
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/forum/post" />
<mvc:mapping path="/forum/reply/*" />
<bean class="com.uncle5.pubrub.web.security.CsrfInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
当用户访问"/forum/post"这个请求时候,会直接进入CsrfInterceptor的preHandle方法,此处针对post请求进行了判断,如果从request中获取的csrfToken不存在或者与session中的csrfToken不相匹配,那么可以不进行后续流程,至于返回404还是返回到登录页面,就随便作者了。
转载地址:http://www.oschina.net/code/piece_full?code=27153#45408
发表评论
-
Spring MVC 3.1新特性 生产者、消费者请求限定
2015-06-15 07:42 715参考地址: http://www.iteye.com/to ... -
Spring MVC Controller单例陷阱
2014-06-27 08:51 680Spring MVC Controller默认是 ... -
[Spring] Hessian权限认证,加密前面
2014-03-06 09:52 1613Hessian的一些基本简介已经在上一节已经全部介绍了,上一节 ... -
FieldRetrievingFactoryBean 和 MethodInvokingFactoryBean
2014-01-09 18:36 1019spring提供了filed的值注入和method的返回值注入 ... -
Spring中ApplicationContext的事件机制(二 内定事件)
2014-01-09 11:08 12341在Spring中已经定义了五个标准事件,分别介绍如下: 1) ... -
当spring 容器初始化完成后执行某个方法 .
2014-01-08 17:40 1443在某些应用中,我们希望,当spring 容器将所有的bea ... -
spring学习之springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序
2013-09-12 10:43 1214spring mvc处理方法支持如下的返回方式:ModelA ... -
JSR-303
2013-09-12 00:22 931JSR-303 是JAVA EE 6 中的一项子规范,叫做Be ... -
EHCACHE分布式缓存
2013-09-06 17:26 1313从1.2版本开始,Ehcache可 ... -
springMVC+freemarker整合
2013-09-06 16:39 1435springMVC整合大家都比较熟悉了吧主要有以下几个步骤: ... -
Spring MVC 学习笔记 Viewresol和View
2013-09-06 15:34 929Spring MVC使用ViewResolver来根据cont ... -
Spring的PropertyPlaceholderConfigurer应用
2013-09-06 15:04 3221Spring 利用PropertyPlaceholderCon ... -
SpringSecurity3_Logout
2013-08-22 16:07 2582Logout¶•退出登录的链接 <a href=&quo ... -
spring的default-lazy-init参数 .
2013-04-23 20:08 979spring在启动的时候,会默认加载会默认加载整个对象实例图, ... -
Spring MVC 如何防止XSS、SQL注入攻击
2013-04-16 15:40 1683在Web项目中,通常需要处理XSS,SQL注入攻击,解决这个问 ... -
Spring JMS
2013-01-08 10:48 985http://blog.csdn.net/shiqiang12 ... -
给spring jdbctemplate加上一层“绮丽外衣”-动态SQL&&SQL语句以文件存放
2013-01-07 16:00 3306给spring jdbctemplate加上一层“华丽外衣”- ... -
使用Spring的NamedParameterJdbcTemplate完成DAO操作 .
2013-01-07 14:54 1185NamedParameterJdbcTemplate内部包含了 ... -
cron表达式(quartz中时间表达式)
2012-12-20 15:54 1003http://sosuny.iteye.com/blog/46 ... -
spring 3中新增的@value注解
2012-11-26 22:31 3381在spring 3.0中,可以通过使用@value,对一些如x ...
相关推荐
Invalid CSRF Token(解决方案).md
在Django框架中,为了确保Web应用的安全性,防止CSRF(Cross-site request forgery)攻击,开发者需要在处理POST请求时添加一个名为`csrftoken`的令牌。CSRF攻击是一种恶意用户在用户浏览器中利用已登录用户的权限...
当你遇到"CSRF token missing or incorrect"的错误时,通常意味着Django无法找到或验证表单中的CSRF令牌,这可能是由于以下几个原因: 1. **缺失的CSRF令牌**:在Django的POST表单中,你需要包含`{% csrf_token %}`...
CSRF Token Missing(解决方案).md
CSRF Token Mismatch(解决方案).md
补丁加csrftoken从饼干作为X-CSRFToken头球每个SuperAgent的要求。 用法 // Just require patch require ( 'superagent-django-csrf' ) ; 安装 npm install superagent-django-csrf 执照 麻省理工学院:copyright:
xhr.setRequestHeader("X-CSRFToken", csrftoken); }, success: function(response) { // 处理成功响应 }, error: function(jqXHR, textStatus, errorThrown) { // 处理错误响应 } }); ``` **步骤3:确保...
【网络安全自学篇】八十三.WHUCTF之CSS注入、越权、csrf-token窃取及XSS总结 本文主要介绍了网络安全领域中常见的几种攻击手段,包括CSS注入、越权访问、csrf-token窃取以及XSS跨站脚本攻击,并通过WHUCTF比赛中的...
npm install --save django-react-csrftoken 用法 import React from 'react' ; import DjangoCSRFToken from 'django-react-csrftoken' class MyLoginForm extends React . Component { render ( ) { return ( ...
用过Django 进行开发的同学都知道,Django框架天然支持对CSRF攻击的防护,因为其内置了一个名为CsrfViewMiddleware的中间件,其基于Cookie方式的防护原理,相比基于session的方式,更适合目前前后端分离的业务场景。...
之后,每当发送需要CSRF保护的Ajax请求时,都需要在请求头中添加`X-CSRFToken`字段,并设置其值为cookie中的`csrftoken`。 ```javascript // 检查是否是无需CSRF保护的HTTP方法 function csrfSafeMethod(method) { ...
4. HttpSession 类型 CSRF Token 存储:服务端 HttpSession 中存储 CSRF Token,有效时间为 HttpSession 最大不活动时间间隔。 其他安全议题: 1. XSS 跨站脚本攻击:一种网站应用程序安全漏洞攻击,攻击者可以将...
use ( VueCsrf , { selector : 'meta[name="csrf-token"]' , // selector of csrf element with csrf-token value attribute : 'content' , //attribute of csrf-token element} ) ; 然后您可以通过下一个命令获取...
CSRF漏洞防御主要包括四种方法:验证码防御、Referer Check防御、Anti CSRF Token防御和Token泄露。 验证码防御 验证码防御是一种非常简单而且有效的防御方法。它可以强制用户与应用程序交互,才能最终完成操作。...