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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM