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,針對表單提交,可以在表單中增加如下隱藏域:
1
|
<input type = “hidden” name = “${_csrf.parametername}” value = “${_csrf.token}” /> |
如果您使用的是json,則無法在http參數中提交csrf令牌。相反,您可以在http頭中提交令牌。一個典型的模式是將csrf令牌包含在元標記中。下面顯示了一個jsp示例:
1
2
3
4
5
6
|
<html> <head> <meta name = “_csrf” content = “${_csrf.token}” /> <!-- 默認標題名稱是x-csrf-token --> <meta name = “_csrf_header” content = “${_csrf.headername}” /> </ head> |
然后,您可以將令牌包含在所有ajax請求中。如果您使用jquery,可以使用以下方法完成此操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@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防護 } } |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/yjclsx/article/details/80349906