欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解讀vue項(xiàng)目防范XSS攻擊問題

 更新時(shí)間:2023年01月22日 11:11:05   作者:夲木^_^  
這篇文章主要介紹了解讀vue項(xiàng)目防范XSS攻擊問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1.對(duì)于從接口請(qǐng)求的數(shù)據(jù)

盡量使用{{}}加載,而不是V-HTML。

vue中的大括號(hào)會(huì)把數(shù)據(jù)解釋為普通文本。通常如果要解釋成html代碼則要用v-html。

而此指令相當(dāng)于innerHTML。

雖然像innerHTML一樣不會(huì)直接輸出script標(biāo)簽,但也可以輸出img,iframe等標(biāo)簽。

vue文檔關(guān)于v-html的說明如下所示:

2.對(duì)用V-HTML和INNERHTML加載的客戶信息進(jìn)行轉(zhuǎn)義

如果顯示內(nèi)容里面有html片段,一定需要用v-html或者innerHTML加載

例如:

<div v-html="`<span>${message}</span>`"></div>

里面的message是客戶自己輸入的信息,如果此時(shí)是惡意的dom片段肯定會(huì)引起XSS攻擊。此時(shí)我們可以對(duì)“<”,">"轉(zhuǎn)譯成“<”,“>”。然后再輸入到頁面。

可以使用lodash里面的escape方法對(duì)客戶信息進(jìn)行轉(zhuǎn)譯。

如下:

import _escape from 'lodash/escape'
Vue.prototype.$escape = _escape

在vue中插入一個(gè)全局方法,對(duì)需要轉(zhuǎn)譯的數(shù)據(jù)就使用這個(gè)方法:

<div v-html="`<span>${$escape(message)}</span>`"></div>

3.在入口頁面的META中使用CSP

在入口文件的head添加meta標(biāo)簽

<meta http-equiv="Content-Security-Policy" content="script-src 'self';style-src 'self'">
<meta http-equiv="Content-Security-Policy" content="style-src 'self' 'unsafe-inline';script-src 'self' 'unsafe-inline' 'unsafe-eval' https://webapi.amap.com https://restapi.amap.com https://vdata.amap.com https://appx/web-view.min.js;worker-src blob:">

該指令說明:允許自身css、js和高德地圖api、地圖數(shù)據(jù)。

上面的CSP設(shè)置表示,script腳本資源和style樣式資源只能加載當(dāng)前域名下的資源。這樣子可以避免外部惡意的腳本的加載和執(zhí)行。

如果頁面有例如下面的標(biāo)簽,那這些CDN資源是加載不了的。

<link  rel="stylesheet">
<script src='https://cdn.bootcdn.net/ajax/libs/angular.js/0.10.0/angular-ie-compat.js'></script>

題外話:個(gè)人不倡議用第三方CDN,其一是不會(huì)減少頁面加載資源的體積,其二是第三方CDN穩(wěn)定性不能保證,有時(shí)候第三方CDN的服務(wù)器會(huì)掛掉導(dǎo)致需要的資源加載不了。

一般會(huì)用下面的CSP配置:

<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-eval';style-src 'self' 'unsafe-inline'">

設(shè)置解釋:

  • script-src:只加載當(dāng)面域名服務(wù)器下的資源,且允許eval執(zhí)行腳本。因?yàn)閣ebpack在development模式下大量使用eval進(jìn)行腳本注入,且在development中常用的souce-map是cheap-module-eval-source-map。
  • 如果script-src設(shè)置成‘self’會(huì)阻止eval的使用。
  • style-src:只加載當(dāng)面域名服務(wù)器下的資源,且允許使用內(nèi)聯(lián)資源。有時(shí)候無論在開發(fā)環(huán)境還是生產(chǎn)環(huán)境,可能都是通過webpack打包把CSS內(nèi)容打包到JS文件里面。加載頁面時(shí),JS腳本會(huì)在頁面中插入一個(gè)個(gè)style標(biāo)簽補(bǔ)充層疊樣式模型。如果style-src設(shè)置成‘self’會(huì)阻止style內(nèi)聯(lián)樣式的插入和執(zhí)行。

4.針對(duì)特殊場(chǎng)景,選擇性過濾XSS標(biāo)簽

在項(xiàng)目中,XSS的安全漏洞很容易出現(xiàn),例如在聊天模塊和富文本模塊很容易出現(xiàn)。

有時(shí)候你想實(shí)現(xiàn)富文本編輯器里編輯html內(nèi)容的業(yè)務(wù)。

可是又擔(dān)心XSS惡意腳本的注入。

此時(shí)可以使用一個(gè)xss工具。

網(wǎng)址:https://github.com/leizongmin/js-xss。

更詳細(xì)的用法可以看附上的網(wǎng)址,這里簡單說一下用法。

首先下載xss

npm i xss -S

(1)在頁面中引入資源且生成XSS過濾器,對(duì)內(nèi)容進(jìn)行過濾

var xss = require("xss")?
const option={} //自定義設(shè)置
const myxss = new xss.FilterXSS(option);
const line='<script type="text/javascript">alert(1);</script>'
var html = myxss.process(line);
console.log(html); //輸出:&lt;script type="text/javascript"&gt;alert(1);&lt;/script&gt;

(2)如果我想不過濾img標(biāo)簽的onerror屬性,或者不過濾style標(biāo)簽。

通過設(shè)置whiteList可選擇性的保留特定標(biāo)簽及其屬性

例如:

const option={
? ? whiteList:{
? ? ? ? img:['src','onerror'] //img標(biāo)簽保留src,onerror屬性
? ? ? ? style:['type'] //style標(biāo)簽?zāi)J(rèn)是不在whileList屬性里的,現(xiàn)在添加上去
? ? }
}
const myxss = new xss.FilterXSS(option);
letline='<img src="./123.png" onerror="alert(1);" alt="123">'
let html = myxss.process(line);
console.log(html); //輸出:<img src="./123.png" onerror="alert(1);">
line='<style type="text/css">color:white;</style>'
html = myxss.process(line);
console.log(html); //輸出:<style type="text/css">color:white;</style>

xss默認(rèn)的whiteList可以通過console.log(xss.whiteList)顯示。

(3)如果想徹底過濾掉類似script,noscript標(biāo)簽,option可如下設(shè)置:

const option={
? ? stripIgnoreTagBody: ["script","noscript"],
}
const myxss = new xss.FilterXSS(option)
let line='<script type="text/javascript">alert(1);</script>'
let html = myxss.process(line)
console.log(html.length) //輸出0,即html被轉(zhuǎn)化為空字符串
line='<noscript>123</noscript>'
html = myxss.process(line)
console.log(html.length) //輸出0,即html被轉(zhuǎn)化為空字符串

stripIgnoreTagBody用于設(shè)置不在whiteList的標(biāo)簽的過濾方法。

例如script,不在whiteList會(huì)被執(zhí)行xss內(nèi)部的escapeHtml方法。如一開頭的例子會(huì)把“<”,“>”進(jìn)行轉(zhuǎn)義。

但如果stripIgnoreTagBody中添加了script。則會(huì)直接把整個(gè)script標(biāo)簽過濾掉。

(4)xss默認(rèn)生成的過濾器是會(huì)過濾掉任何標(biāo)簽的class屬性。

如果我們不想過濾任何在whiteList的標(biāo)簽的class屬性,可以這么設(shè)置:

const option={
? ? onIgnoreTagAttr: function(tag, name, value, isWhiteAttr) {
? ? ? ? if (['style','class'].includes(name)) {
? ? ? ? ? ? return `${name}="${xss.escapeAttrValue(value)}"`
? ? ? ? }
? ? },
}
const myxss = new xss.FilterXSS(option);
let line='<div class="box"></div>'
let html = myxss.process(line);
console.log(html); //輸出:<div class="box"></div>

onIgnoreAttr方法用于設(shè)置白名單中特定屬性的過濾方法。

更多詳細(xì)教程請(qǐng)看一開頭附上的網(wǎng)址。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關(guān)文章

  • vue實(shí)現(xiàn)自定義日期組件功能的實(shí)例代碼

    vue實(shí)現(xiàn)自定義日期組件功能的實(shí)例代碼

    這篇文章主要介紹了vue自定義日期組件的實(shí)現(xiàn)代碼,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11
  • vue3+vite+vant4手機(jī)端項(xiàng)目實(shí)戰(zhàn)記錄

    vue3+vite+vant4手機(jī)端項(xiàng)目實(shí)戰(zhàn)記錄

    這篇文章主要給大家介紹了關(guān)于vue3+vite+vant4手機(jī)端項(xiàng)目實(shí)戰(zhàn)的相關(guān)資料,Vue3是一種前端開發(fā)框架,它的目標(biāo)是提供更好的性能和開發(fā)體驗(yàn),需要的朋友可以參考下
    2023-08-08
  • 使用Element+vue實(shí)現(xiàn)開始與結(jié)束時(shí)間限制

    使用Element+vue實(shí)現(xiàn)開始與結(jié)束時(shí)間限制

    這篇文章主要為大家詳細(xì)介紹了使用Element+vue實(shí)現(xiàn)開始與結(jié)束時(shí)間限制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • vue利用sync語法糖實(shí)現(xiàn)modal彈框的項(xiàng)目實(shí)踐

    vue利用sync語法糖實(shí)現(xiàn)modal彈框的項(xiàng)目實(shí)踐

    本文主要介紹了vue利用sync語法糖實(shí)現(xiàn)modal彈框的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Vue與.net?Core?接收List<T>泛型參數(shù)

    Vue與.net?Core?接收List<T>泛型參數(shù)

    這篇文章主要介紹了Vue與.net?Core?接收List<T>泛型參數(shù),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-04-04
  • vue中緩存組件keep alive的介紹及使用方法

    vue中緩存組件keep alive的介紹及使用方法

    這篇文章主要介紹了vue緩存組件keepalive的相關(guān)資料,keep-alive組件是使用 include exclude這兩個(gè)屬性傳入組件名稱來確認(rèn)哪些可以被緩存的,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2022-08-08
  • Vue中虛擬列表的原理與實(shí)現(xiàn)詳解

    Vue中虛擬列表的原理與實(shí)現(xiàn)詳解

    虛擬列表是一種技術(shù),它只渲染用戶當(dāng)前可見的列表項(xiàng),而不是渲染整個(gè)列表,這篇文章主要來和大家聊聊虛擬列表的原理與實(shí)現(xiàn),希望對(duì)大家有所幫助
    2023-05-05
  • Vue+SpringBoot開發(fā)V部落博客管理平臺(tái)

    Vue+SpringBoot開發(fā)V部落博客管理平臺(tái)

    V部落是一個(gè)多用戶博客管理平臺(tái)。這篇文章主要介紹了Vue+SpringBoot開發(fā)V部落博客管理平臺(tái),需要的朋友可以參考下
    2017-12-12
  • 解決vue跨域axios異步通信問題

    解決vue跨域axios異步通信問題

    這篇文章主要介紹了解決vue跨域axios異步通信問題,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-04-04
  • Vue讓router-view默認(rèn)顯示頁面操作方法

    Vue讓router-view默認(rèn)顯示頁面操作方法

    一個(gè)home頁面,點(diǎn)擊左邊的菜單欄,右邊顯示頁面,因此都知道在右邊放一個(gè)router-view然后配置路由即可,然而問題出現(xiàn)在:重新打開的時(shí)候,默認(rèn)是白色空的,遇到這樣的問題如何解決呢,下面小編給大家分享Vue讓router-view默認(rèn)顯示頁面操作方法,感興趣的朋友一起看看吧
    2024-03-03

最新評(píng)論