解决Spring Security 表单上传文件CSRF失效的问题


在Spring Security4中引入的CSRF是不错的安全机制. 但在常用的上传文件中(form提交, post, 使用commons-fileupload)会导致CSRF失效,

这问题的根源在于CSRF无法获取表单中的_csrf 的值引起的(可在CsrfFilter打断点查看).


之前我也被这问题困惑了一天, 不知如何是好.

解决之道如下:


1.升级项目中使用的Servlet API版本至3.0及以上. 

2.不要使用commons-fileupload组件,即

CommonsMultipartResolver

, 而使用Servelt提供的组件对象
StandardServletMultipartResolver
其在Spring MVC中的配置如下:

	
	

3.在Spring MVC的DispatchServlet配置中添加如下配置(web.xml中)

        
            
            1000000
        

其中的即限制上传文件的大小. 完整的DispatchServelt配置如下:

	
		mvc
		org.springframework.web.servlet.DispatcherServlet
		2
        
            
            1000000
        
	
	
		mvc
		/
	


注意在升级Servlet API后需要将web.xml的状况声明也更新为3.0的,如下:




至此, CSRF工作正常.

分析大概的原因是commons-fileupload组件对request进行封装时对CSRF的支持有问题. 没将_csrf值传递.



参考文章: http://stackoverflow.com/questions/25185578/spring-security-3-2-csrf-and-multipart-requests


你可能感兴趣的:(java,Spring)