1. 程式人生 > >spring security CSRF防護

spring security CSRF防護

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

CSRF是指跨站請求偽造(Cross-site request forgery),是web常見的攻擊之一。 從Spring Security 4.0開始,預設情況下會啟用CSRF保護,以防止CSRF攻擊應用程式,Spring Security CSRF會針對PATCH,POST,PUT和DELETE方法進行防護。 我這邊是spring boot專案,在啟用了@EnableWebSecurity註解後,csrf保護就自動生效了。 所以在預設配置下,即便已經登入了,頁面中發起PATCH,POST,PUT和DELETE請求依然會被拒絕,並返回403,需要在請求介面的時候加入csrfToken才行。 如果你使用了freemarker之類的模板引擎或者jsp,針對表單提交,可以在表單中增加如下隱藏域:

<input  type = “hidden”  name = “${_csrf.parameterName}”  value = “${_csrf.token}” /> 
  • 1

如果您使用的是JSON,則無法在HTTP引數中提交CSRF令牌。相反,您可以在HTTP頭中提交令牌。一個典型的模式是將CSRF令牌包含在元標記中。下面顯示了一個JSP示例:

<html> 
<head> 
    <meta  name = “_csrfcontent = “${_csrf.token}” /> 
    <!-- 預設標題名稱是X-CSRF-TOKEN  -->
<meta name = “_csrf_headercontent = “${_csrf.headerName}” /> </ head>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

然後,您可以將令牌包含在所有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){ } });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

如果你不想啟用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防護
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
這裡寫圖片描述