王者榮耀做網(wǎng)站什么軟件可以免費(fèi)發(fā)廣告
定義:
后果
比如黑客可以通過惡意代碼,拿到用戶的cookie就可以去登陸了
分類
存儲(chǔ)型
攻擊者把惡意腳本存儲(chǔ)在目標(biāo)網(wǎng)站的數(shù)據(jù)庫(kù)中(沒有過濾直接保存),當(dāng)用戶訪問這個(gè)頁面時(shí),惡意腳本會(huì)從數(shù)據(jù)庫(kù)中被讀取并在用戶瀏覽器中執(zhí)行。比如在那些允許用戶評(píng)論的網(wǎng)站, 用戶越多,中招的越多
流程
反射型
攻擊者通過構(gòu)造惡意鏈接,誘使用戶點(diǎn)擊,惡意腳本隨請(qǐng)求發(fā)送到目標(biāo)網(wǎng)站服務(wù)器,服務(wù)器查看了鏈接以后以為用戶要檢索某些信息,并沒有進(jìn)行額外的過濾,服務(wù)器的數(shù)據(jù)庫(kù)也不需要保存什么信息,就只是返回了對(duì)應(yīng)的結(jié)果,瀏覽器只是把結(jié)果呈現(xiàn)在頁面.
例子
反射型一般是利用網(wǎng)頁的檢索功能, 你輸入的檢索信息會(huì)顯示在頁面中
如果url加一個(gè)script標(biāo)簽, 也就注入網(wǎng)頁成為內(nèi)容的一部分,瀏覽器就會(huì)去執(zhí)行這個(gè)js代碼
DOM型
攻擊者在url中插入惡意代碼,前端直接從url中獲取惡意代碼并且輸出到頁面,導(dǎo)致惡碼被執(zhí)行, 跟反射型很像,但瀏覽器并未把惡意代碼發(fā)送給服務(wù)器, 是前端直接執(zhí)行的. 比如url中的hash部分是不會(huì)發(fā)送給服務(wù)器的,即url前面的部分服務(wù)器照常請(qǐng)求,也就是瀏覽器的渲染分了兩步走,給黑客留下可以攻擊的漏洞
“#”部分的更改不會(huì)重新發(fā)送請(qǐng)求, 此頁面將hash注入到了頁面,黑客就可以利用這個(gè)點(diǎn)往頁面注入內(nèi)容, 比如獲取cookie并發(fā)送等
三者區(qū)別
DOM 型取出和執(zhí)?惡意代碼由瀏覽器端完成,不涉及將惡意腳本發(fā)送到服務(wù)器,屬于前端JavaScript 自身的安全漏洞,而其他兩種屬于服務(wù)端的安全漏洞。
應(yīng)對(duì)策略
對(duì)用戶輸入進(jìn)行嚴(yán)格的驗(yàn)證和過濾
前端驗(yàn)證
- 通過h5表單屬性,如pattern正則表達(dá)式模式,type字段的屬性進(jìn)行限制等;
- js中的動(dòng)態(tài)驗(yàn)證: 通過對(duì)輸入添加addevenlistener監(jiān)聽
服務(wù)端驗(yàn)證
無論客戶端是否驗(yàn)證,都必須在服務(wù)器端再次驗(yàn)證輸入。
可以使用后端語言的內(nèi)置函數(shù)或正則表達(dá)式進(jìn)行驗(yàn)證。
輸入過濾
- 用戶輸入顯示在網(wǎng)頁上之前,將其中的特殊字符(如 <, >, &, ', ")轉(zhuǎn)義,防止其被解釋為腳本, 防止 XSS 攻擊。
- URL 編碼: 將 URL 中的特殊字符轉(zhuǎn)換為 % 加上兩位十六進(jìn)制數(shù)的形式,以確保 URL 安全傳輸。
let userInput = 'hello world';
let encodedInput = encodeURIComponent(userInput);
console.log(encodedInput); // hello%20world
限制用戶輸入的長(zhǎng)度
防止緩沖區(qū)溢出和資源濫用。
內(nèi)容安全策略CSP
在網(wǎng)關(guān)通過HTTP 響應(yīng)頭設(shè)Content-Security-Policy或者HTML 標(biāo)簽設(shè)置,本質(zhì)是建立一個(gè)白名單,告訴瀏覽器哪些外部資源可以加載和執(zhí)行,從而防止惡意代碼的注入攻擊。
CSP 通過指定允許的資源來源,阻止了惡意腳本、樣式表、圖像等資源的加載。例如,通過配置 script-src,可以只允許從可信任的域名加載腳本,任何來自其他域名的腳本都會(huì)被阻止
http-only
黑客本質(zhì)是想獲取cookie拿到客人信息, 而Cookie有一個(gè)http-only屬性,表示只能被http請(qǐng)求攜帶,不能通過客戶端js腳本訪問cookie,
textContent代替innerHTML(反射型)
所以前端應(yīng)該避免使用innerHTML、document.write, v-html、dangerouslySetInnerHTML 把不可信的數(shù)據(jù)作為 HTML 插到頁面上,而應(yīng)盡量使用 textContent 等。
textContent 屬性用于設(shè)置或獲取一個(gè)元素的文本內(nèi)容。與 innerHTML 不同,textContent 僅處理文本,不會(huì)解析 HTML 標(biāo)簽。
參考視頻:
https://www.bilibili.com/video/BV1rg411v7B8/?spm_id_from=333.788&vd_source=bb7c78c7981f6b653a3daf2f416312cb
https://www.bilibili.com/video/BV1ww411p7DG/?spm_id_from=pageDriver&vd_source=bb7c78c7981f6b653a3daf2f416312cb