SpringBoot如何防止XSS注入攻擊詳解
什么是 XSS 攻擊
在跨站腳本(XSS)攻擊中,攻擊者可以在受害者的瀏覽器中執(zhí)行惡意腳本。這種攻擊通常是通過(guò)在網(wǎng)頁(yè)中插入惡意代碼 (JavaScript) 來(lái)完成的。攻擊者在使用攻擊后一般能夠:
- 修改網(wǎng)頁(yè)內(nèi)容
- 將用戶重定向到其他網(wǎng)站
- 訪問用戶的 Cookie 并利用此信息來(lái)冒充用戶
- 訪問有關(guān)用戶系統(tǒng)的關(guān)鍵信息,例如地理位置,網(wǎng)絡(luò)攝像頭,文件系統(tǒng)
- 將木馬功能注入應(yīng)用程序
如果被攻擊的用戶在應(yīng)用程序中具有更高的權(quán)限。攻擊者可以完全控制應(yīng)用程序,并破壞所有用戶及其數(shù)據(jù)。
XSS 攻擊類型
常見的 XSS 攻擊主要有三種:存儲(chǔ)型 XSS 攻擊,反射型 XSS 攻擊和 DOM-based 型 XSS 攻擊。
- 存儲(chǔ)型主要是將 XSS 代碼保存在服務(wù)端(數(shù)據(jù)庫(kù)、文件系統(tǒng)等),當(dāng)用戶以后再次請(qǐng)求該資源時(shí)重新解析該 XSS 代碼,從而出現(xiàn)攻擊。
- 反射型主要發(fā)生在一個(gè)應(yīng)用程序使用動(dòng)態(tài)頁(yè)面向用戶顯示錯(cuò)誤消息時(shí),如果消息中注入了惡意代碼就會(huì)造成 XSS 反射型攻擊。
- DOM-based 主要是通過(guò)腳本直接修改客戶端的 DOM 結(jié)構(gòu),一般這種都是屬于前端 JavaScript 的漏洞。
如何阻止 XSS 注入
下面是一個(gè)簡(jiǎn)單的POST方法,模擬創(chuàng)建 Book 并將其保存到數(shù)據(jù)庫(kù)中。
@RestController @RequestMapping("/books") public class BookController { @Autowired IBookService bookService; @PostMapping public void saveBook(@RequestBody Book book) { bookService.save(book); } }
我們可以在保存的時(shí)候,對(duì) type 值做一段 js 注入,來(lái)模擬存儲(chǔ)型 XSS 攻擊。
現(xiàn)在我們來(lái)請(qǐng)求一下,這里的 JavaScript 只會(huì) alert 一個(gè)語(yǔ)句,但這種漏洞就有可能被別人利用來(lái)注入一些其他的惡意代碼:
X-XSS-Protection 響應(yīng)頭
一些瀏覽器內(nèi)置了對(duì)過(guò)濾反射型 XSS 攻擊的支持。在一定程度上有助于 XSS 保護(hù)。 我們需要在 HTTP 響應(yīng)頭添加如下內(nèi)容確保已啟用該功能,并指示瀏覽器在檢測(cè)到 XSS 攻擊時(shí)進(jìn)行阻止。
X-XSS-Protection: 1; mode=block
如果你的項(xiàng)目引入了 Spring Security ,那么默認(rèn)情況下就會(huì)自動(dòng)添加此標(biāo)頭。
添加Content-Security-Policy響應(yīng)標(biāo)頭
兼容 內(nèi)容安全策略 瀏覽器將僅執(zhí)行從我們的“允許”列出的域接收的源文件中加載的腳本,而忽略所有其他腳本,例如內(nèi)聯(lián)腳本。我們可以添加以下標(biāo)頭來(lái)啟用瀏覽器的內(nèi)容安全策略功能。
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity httpSecurity) throws Exception { httpSecurity .csrf().disable()//為了簡(jiǎn)化示例并更清楚地說(shuō)明XSS注入,此處禁用了CSRF保護(hù)。真實(shí)情況請(qǐng)勿使用。 .authorizeRequests().anyRequest().authenticated() .and().httpBasic() .and() .headers().contentSecurityPolicy("script-src 'self'"); } }
以下是所有支持 CSP 的瀏覽器:
入?yún)Ⅱ?yàn)證
我們知道該字段僅需要中文英文和數(shù)字字符,因此我們可以使用 Spring 的 Validator 在字段中添加@Pattern注解。
@NotNull @Pattern(message="種類只能支持中文英文數(shù)字", regexp = "[\u4e00-\u9fa5_a-zA-Z0-9]+") private String type;
然后將 @Valid 添加到接收 Book 的方法中,這樣當(dāng)發(fā)生請(qǐng)求時(shí)就會(huì)自動(dòng)驗(yàn)證:
@PostMapping public void saveBook(@RequestBody @Valid Book book) { bookService.save(book); }
客戶端
現(xiàn)在主流的幾種前端框架,像 Angular 、 React 、 Vue 也可以避免傳統(tǒng)開發(fā)可能帶來(lái)的問題:
- 為了系統(tǒng)地阻止 XSS 錯(cuò)誤,默認(rèn)情況下,Angular 將所有值視為不可信。當(dāng)通過(guò)屬性,屬性,樣式,類綁定或插值將值從模板插入 DOM 時(shí),Angular 會(huì)清理并轉(zhuǎn)義不受信任的值。
- 使用 JSX(React) 可以傳遞一個(gè)函數(shù)作為事件處理程序,而不是傳遞可能包含惡意代碼的字符串。
- React 視圖中的字符串變量將自動(dòng)轉(zhuǎn)義。
- Vue 的官方文檔也有說(shuō)明, v-html 動(dòng)態(tài)的渲染任意 html 是十分危險(xiǎn)的,容易引發(fā) XSS 注入,所以 v-html 永遠(yuǎn)不要用于用戶提交的信息上。
總結(jié)
防止 XSS 漏洞主要涉及以下措施的組合:
- 利用 X-XSS-Protection 響應(yīng)頭,利用瀏覽器的支持來(lái)限制反射的 XSS 攻擊。
- 利用 Content-Security-Policy 響應(yīng)頭來(lái)啟用瀏覽器的 CSP 功能。
- 使用 Validator 對(duì)輸入信息做相關(guān)校驗(yàn)。
- 客戶端方面 React 使用 JSX 傳遞函數(shù)作為事件處理程序,Vue 只在可信內(nèi)容上使用 v-html ,對(duì)用戶輸入的信息,一定要禁止使用 v-html 。
到此這篇關(guān)于SpringBoot如何防止XSS注入攻擊的文章就介紹到這了,更多相關(guān)SpringBoot防止XSS注入攻擊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java easyUI實(shí)現(xiàn)自定義網(wǎng)格視圖實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于java easyUI實(shí)現(xiàn)自定義網(wǎng)格視圖的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10Java?Socket實(shí)現(xiàn)文件發(fā)送和接收功能以及遇到的Bug問題
這篇文章主要介紹了Java?Socket實(shí)現(xiàn)文件發(fā)送和接收功能以及遇到的Bug問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08MyBatis-Plus非表字段的三種處理方法小結(jié)
這篇文章主要介紹了MyBatis-Plus非表字段的三種處理方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08java利用CompletionService保證任務(wù)先完成先獲取到執(zhí)行結(jié)果
這篇文章主要為大家詳細(xì)介紹了java如何利用CompletionService來(lái)保證任務(wù)先完成先獲取到執(zhí)行結(jié)果,文中的示例代碼講解詳細(xì),需要的可以參考下2023-08-08ShardingSphere jdbc集成多數(shù)據(jù)源的實(shí)現(xiàn)步驟
本文主要介紹了ShardingSphere jdbc集成多數(shù)據(jù)源的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10SpringMVC后端Controller頁(yè)面跳轉(zhuǎn)的三種方式匯總
這篇文章主要介紹了SpringMVC后端Controller頁(yè)面跳轉(zhuǎn)的三種方式匯總,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10SpringBoot如何配置Controller實(shí)現(xiàn)Web請(qǐng)求處理
這篇文章主要介紹了SpringBoot如何配置Controller實(shí)現(xiàn)Web請(qǐng)求處理,文中通過(guò)圖解示例介紹的很詳細(xì),具有有一定的參考價(jià)值,需要的小伙伴可以參考一下2023-05-05詳解Spring/Spring boot異步任務(wù)編程WebAsyncTask
這篇文章主要介紹了詳解Spring/Spring boot異步任務(wù)編程WebAsyncTask,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06使用WebSocket實(shí)現(xiàn)即時(shí)通訊(一個(gè)群聊的聊天室)
這篇文章主要為大家詳細(xì)介紹了使用WebSocket實(shí)現(xiàn)即使通訊,實(shí)現(xiàn)一個(gè)群聊的聊天室,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03Java8 HashMap的實(shí)現(xiàn)原理分析
Java8之后新增挺多新東西,接下來(lái)通過(guò)本文給大家介紹Java8 HashMap的實(shí)現(xiàn)原理分析,對(duì)java8 hashmap實(shí)現(xiàn)原理相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-03-03