? 開(kāi)啟 csrf 后 列表頁(yè)面沒(méi)有數(shù)據(jù)
在集安等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供做網(wǎng)站、成都做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需定制,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)營(yíng)銷推廣,成都外貿(mào)網(wǎng)站制作,集安網(wǎng)站建設(shè)費(fèi)用合理。
? 頁(yè)面console.log(403)
HTTP Status 403-Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.
? 首先,科普一下,什么是"CSRF"?
? 這是一個(gè)web應(yīng)用安全的問(wèn)題,CSRF(Cross-site request forgery)跨站請(qǐng)求偽造,也被稱為“One Click Attack” 或者Session Riding,***方通過(guò)偽造用戶請(qǐng)求訪問(wèn)受信任站點(diǎn)。
客戶端與服務(wù)端在基于http協(xié)議在交互的數(shù)據(jù)的時(shí)候,由于http協(xié)議本身是無(wú)狀態(tài)協(xié)議,后來(lái)引進(jìn)了cookie的 方式進(jìn)行記錄服務(wù)端和客戶端的之間交互的狀態(tài)和標(biāo)記。cookie里面一般會(huì)放置服務(wù)端生成的session id(會(huì)話ID)用來(lái)識(shí)別客戶端訪問(wèn)服務(wù)端過(guò) 程中的客戶端的身份標(biāo)記。
? 再科普一下,什么事"跨域" ?
? 同一個(gè)ip、同一個(gè)網(wǎng)絡(luò)協(xié)議、同一個(gè)端口,三者都滿足就是同一個(gè)域,否則就有跨域問(wèn)題 ,在跨域 的情況下 session id可能會(huì)被惡意第三方劫持,此時(shí)劫持這個(gè)session id的第三方會(huì)根據(jù)這個(gè)session id向服務(wù)器發(fā)起請(qǐng)求,此時(shí)服務(wù)器收到這個(gè)請(qǐng)求會(huì) 認(rèn)為這是合法的請(qǐng)求,并返回根據(jù)請(qǐng)求完成相應(yīng)的服務(wù)端更新。
? 1)如果這個(gè)http請(qǐng)求是通過(guò)get方式發(fā)起的請(qǐng)求,意味著它只是訪問(wèn)服務(wù)器 的資源,僅僅只是查詢,沒(méi)有更新服務(wù)器的資源,所以對(duì)于這類請(qǐng)求,spring security的防御策略是允許的;
? 2)如果這個(gè)http請(qǐng)求是通過(guò)post請(qǐng)求發(fā)起的, 那么spring security是默認(rèn)攔截這類請(qǐng)求的,因?yàn)檫@類請(qǐng)求是帶有更新服務(wù)器資源的危險(xiǎn)操作,如果惡意第三方可以通過(guò)劫持session id來(lái)更新 服務(wù)器資源,那會(huì)造成服務(wù)器數(shù)據(jù)被非法的篡改,所以這類請(qǐng)求是會(huì)被Spring security攔截的,在默認(rèn)的情況下,spring security是啟用csrf 攔截功能的,這會(huì)造成,在跨域的情況下,post方式提交的請(qǐng)求都會(huì)被攔截?zé)o法被處理(包括合理的post請(qǐng)求),前端發(fā)起的post請(qǐng)求后端無(wú)法正常 處理,雖然保證了跨域的安全性,但影響了正常的使用,如果關(guān)閉csrf防護(hù)功能,雖然可以正常處理post請(qǐng)求,但是無(wú)法防范通過(guò)劫持session id的非法的post請(qǐng)求,所以spring security為了正確的區(qū)別合法的post請(qǐng)求,采用了token的機(jī)制 。
? 3)我在科普下:spring Security 3默認(rèn)關(guān)閉csrf,Spring Security 4默認(rèn)啟動(dòng)了csrf
? 4)如果不采用csrf,可禁用security的csrf ,如下
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
………………
.csrf().disable();
}
## 4、重點(diǎn)解決問(wèn)題
我想開(kāi)啟且有效,如下配置:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
………………
.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
}
###H5端怎么做
說(shuō)明下網(wǎng)上方法大致有三種,我這里結(jié)合我們自己的平臺(tái)(SpringBoot[v1.5.12]+SpringSecurity[v4.2.5]+ Thymeleaf[v2.1.3])是這么做的
//全局index頁(yè)面 不需要每個(gè)頁(yè)面 都寫(xiě)
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
$(document).ajaxSend(function(e, xhr, options) {
xhr.setRequestHeader(header, token);
});
單獨(dú)AJAX提交思考局部刷新
var headers = {};
headers['X-CSRF-TOKEN'] = "[[${_csrf.token}]]";
//參數(shù)
headers: headers