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防護 } }