spring security的跨域保护(CSRF Protection)
CSRF是指跨站请求伪造(Cross-site request forgery),是web常见的攻击之一。
spring boot项目,在启用了@EnableWebSecurity注解后,csrf保护就自动生效了
使用了freemarker之类的模板引擎或者jsp,针对表单提交,可以在表单中增加如下隐藏域:
<input type = “hidden” name = “${_csrf.parameterName}” value = “${_csrf.token}” />
使用的是JSON,则无法在HTTP参数中提交CSRF令牌。相反,您可以在HTTP头中提交令牌。一个典型的模式是将CSRF令牌包含在元标记中。下面显示了一个JSP示例:
<html>
<head>
<meta name = “_csrf” content = “${_csrf.token}” />
<!-- 默认标题名称是X-CSRF-TOKEN -->
<meta name = “_csrf_header” content = “${_csrf.headerName}” />
</ head>
可以将令牌包含在所有Ajax请求中。如果您使用jQuery,可以使用以下方法完成此操作:
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
$.ajax({
url:url,
type:'POST',
async:false,
dataType:'json', //返回的数据格式:json/xml/html/script/jsonp/text
beforeSend: function(xhr) {
xhr.setRequestHeader(header, token); //发送请求前将csrfToken设置到请求头中
},
success:function(data,textStatus,jqXHR){
}
});
不想启用CSRF保护,可以在spring security配置中取消csrf,如下:
@Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/login").permitAll() .anyRequest().authenticated() .and() ... http.csrf().disable(); //取消csrf防护 } }
立志如山 静心求实
浙公网安备 33010602011771号