《Vue3實戰教程》40:Vue3安全

如果您有疑問,請觀看視頻教程《Vue3實戰教程》

安全?

報告漏洞?

當一個漏洞被上報時,它會立刻成為我們最關心的問題,會有全職的貢獻者暫時擱置其他所有任務來解決這個問題。如需報告漏洞,請發送電子郵件至?security@vuejs.org。

雖然很少發現新的漏洞,但我們仍建議始終使用最新版本的 Vue 及其官方配套庫,以確保你的應用盡可能地安全。

首要規則:不要使用無法信賴的模板?

使用 Vue 時最基本的安全規則就是不要將無法信賴的內容作為你的組件模板。使用無法信賴的模板相當于允許任意的 JavaScript 在你的應用中執行。更糟糕的是,如果在服務端渲染時執行了這些代碼,可能會導致服務器被攻擊。舉例來說:

js

Vue.createApp({template: `<div>` + userProvidedString + `</div>` // 永遠不要這樣做!
}).mount('#app')

Vue 模板會被編譯成 JavaScript,而模板內的表達式將作為渲染過程的一部分被執行。盡管這些表達式在特定的渲染環境中執行,但由于全局執行環境的復雜性,Vue 作為一個開發框架,要在性能開銷合理的前提下完全避免潛在的惡意代碼執行是不現實的。避免這類問題最直接的方法是確保你的 Vue 模板始終是可信的,并且完全由你控制。

Vue 自身的安全機制?

HTML 內容?

無論是使用模板還是渲染函數,內容都是自動轉義的。這意味著在這個模板中:

template

<h1>{{ userProvidedString }}</h1>

如果?userProvidedString?包含了:

js

'<script>alert("hi")</script>'

那么它將被轉義為如下的 HTML:

template

&lt;script&gt;alert(&quot;hi&quot;)&lt;/script&gt;

從而防止腳本注入。這種轉義是使用?textContent?這樣的瀏覽器原生 API 完成的,所以只有當瀏覽器本身存在漏洞時,才會存在漏洞。

Attribute 綁定?

同樣地,動態 attribute 的綁定也會被自動轉義。這意味著在這個模板中:

template

<h1 :title="userProvidedString">hello
</h1>

如果?userProvidedString?包含了:

js

'" onclick="alert(\'hi\')'

那么它將被轉義為如下的 HTML:

template

&quot; onclick=&quot;alert('hi')

從而防止在?title?attribute 解析時,注入任意的 HTML。這種轉義是使用?setAttribute?這樣的瀏覽器原生 API 完成的,所以只有當瀏覽器本身存在漏洞時,才會存在漏洞。

潛在的危險?

在任何 Web 應用中,允許以 HTML、CSS 或 JavaScript 形式執行未經無害化處理的、用戶提供的內容都有潛在的安全隱患,因此這應盡可能避免。不過,有時候一些風險或許是可以接受的。

例如,像 CodePen 和 JSFiddle 這樣的服務允許執行用戶提供的內容,但這是在 iframe 這樣一個可預期的沙盒環境中。當一個重要的功能本身會伴隨某種程度的漏洞時,就需要你自行權衡該功能的重要性和該漏洞所帶來的最壞情況。

注入 HTML?

我們現在已經知道 Vue 會自動轉義 HTML 內容,防止你意外地將可執行的 HTML 注入到你的應用中。然而,在你知道 HTML 安全的情況下,你還是可以顯式地渲染 HTML 內容。

  • 使用模板:

    template
    <div v-html="userProvidedHtml"></div>
  • 使用渲染函數:

    js
    h('div', {innerHTML: this.userProvidedHtml
    })
  • 以 JSX 形式使用渲染函數:

    jsx
    <div innerHTML={this.userProvidedHtml}></div>

警告

用戶提供的 HTML 永遠不能被認為是 100% 安全的,除非它在 iframe 這樣的沙盒環境中,或者該 HTML 只會被該用戶看到。此外,允許用戶編寫自己的 Vue 模板也會帶來類似的危險。

URL 注入?

在這樣一個使用 URL 的場景中:

template

<a :href="userProvidedUrl">click me
</a>

如果這個 URL 允許通過?javascript:?執行 JavaScript,即沒有進行無害化處理,那么就會有一些潛在的安全問題。可以使用一些庫來解決此類問題,比如?sanitize-url,但請注意:如果你發現你需要在前端做 URL 無害化處理,那你的應用已經存在一個更嚴重的安全問題了。任何用戶提供的 URL 在被保存到數據庫之前都應該先在后端做無害化處理。這樣,連接到你 API 的每一個客戶端都可以避免這個問題,包括原生移動應用。另外,即使是經過無害化處理的 URL,Vue 也不能保證它們指向安全的目的地。

樣式注入?

我們來看這樣一個例子:

template

<a:href="sanitizedUrl":style="userProvidedStyles"
>click me
</a>

我們假設?sanitizedUrl?已進行無害化處理,它是一個正常 URL 而非 JavaScript。然而,由于?userProvidedStyles?的存在,惡意用戶仍然能利用 CSS 進行“點擊劫持”,例如,可以在“登錄”按鈕上方覆蓋一個透明的鏈接。如果用戶控制的頁面?https://user-controlled-website.com/?專門仿造了你應用的登錄頁,那么他們就有可能捕獲用戶的真實登錄信息。

你可以想象,如果允許在?<style>?元素中插入用戶提供的內容,會造成更大的漏洞,因為這使得用戶能控制整個頁面的樣式。因此 Vue 阻止了在模板中像這樣渲染 style 標簽:

template

<style>{{ userProvidedStyles }}</style>

為了避免用戶的點擊被劫持,我們建議僅在沙盒環境的 iframe 中允許用戶控制 CSS。或者,當用戶控制樣式綁定時,我們建議使用其對象值形式并僅允許用戶提供能夠安全控制的、特定的屬性,就像這樣:

template

<a:href="sanitizedUrl":style="{color: userProvidedColor,background: userProvidedBackground}"
>click me
</a>

JavaScript 注入?

我們強烈建議任何時候都不要在 Vue 中渲染?<script>,因為模板和渲染函數不應有其他副作用。但是,渲染?<script>?并不是插入在運行時執行的 JavaScript 字符串的唯一方法。

每個 HTML 元素都有能接受字符串形式 JavaScript 的 attribute,例如?onclickonfocus?和?onmouseenter。綁定任何用戶提供的 JavaScript 給這些事件 attribute 都具有潛在風險,因此需要避免這么做。

警告

用戶提供的 JavaScript 永遠不能被認為是 100% 安全的,除非它在 iframe 這樣的沙盒環境中,或者該段代碼只會在該用戶登錄的頁面上被執行。

有時我們會收到漏洞報告,說在 Vue 模板中可以進行跨站腳本攻擊 (XSS)。一般來說,我們不認為這種情況是真正的漏洞,因為沒有切實可行的方法,能夠在以下兩種場景中保護開發者不受 XSS 的影響。

  1. 開發者顯式地將用戶提供的、未經無害化處理的內容作為 Vue 模板渲染。這本身就是不安全的,Vue 也無從溯源。

  2. 開發者將 Vue 掛載到可能包含服務端渲染或用戶提供內容的 HTML 頁面上,這與 #1 的問題基本相同,但有時開發者可能會不知不覺地這樣做。攻擊者提供的 HTML 可能在普通 HTML 中是安全的,但在 Vue 模板中是不安全的,這就會導致漏洞。最佳實踐是:不要將 Vue 掛載到可能包含服務端渲染或用戶提供內容的 DOM 節點上

最佳實踐?

最基本的規則就是只要你允許執行未經無害化處理的、用戶提供的內容 (無論是 HTML、JavaScript 還是 CSS),你就可能面臨攻擊。無論是使用 Vue、其他框架,或是不使用框架,道理都是一樣的。

除了上面為處理潛在危險提供的建議,我們也建議你熟讀下面這些資源:

  • HTML5 安全手冊
  • OWASP 的跨站腳本攻擊 (XSS) 防護手冊

接著你可以利用學到的知識,來審查依賴項的源代碼,看看是否有潛在的危險,防止它們中的任何一個以第三方組件或其他方式影響 DOM 渲染的內容。

后端協調?

類似跨站請求偽造 (CSRF/XSRF) 和跨站腳本引入 (XSSI) 這樣的 HTTP 安全漏洞,主要由后端負責處理,因此它們不是 Vue 職責范圍內的問題。但是,你應該與后端團隊保持溝通,了解如何更好地與后端 API 進行交互,例如,在提交表單時附帶 CSRF 令牌。

服務端渲染 (SSR)?

在使用 SSR 時還有一些其他的安全注意事項,因此請確保遵循我們的?SSR 文檔給出的最佳實踐來避免產生漏洞。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64936.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64936.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64936.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

01.02周二F34-Day44打卡

文章目錄 1. 這家醫院的大夫和護士對病人都很耐心。2. 她正跟一位戴金邊眼鏡的男士說話。3. 那個人是個圓臉。4. 那個就是傳說中的鬼屋。5. 他是個很好共事的人。6. 我需要一杯提神的咖啡。7. 把那個卷尺遞給我一下。 ( “卷尺” 很復雜嗎?)8. 他收到了她將乘飛機來的消息。9.…

Spring Boot項目中使用單一動態SQL方法可能帶來的問題

1. 查詢計劃緩存的影響 深入分析 數據庫系統通常會對常量SQL語句進行編譯并緩存其執行計劃以提高性能。對于動態生成的SQL語句&#xff0c;由于每次構建的SQL字符串可能不同&#xff0c;這會導致查詢計劃無法被有效利用&#xff0c;從而需要重新解析、優化和編譯&#xff0c;…

【Rust自學】10.2. 泛型

喜歡的話別忘了點贊、收藏加關注哦&#xff0c;對接下來的教程有興趣的可以關注專欄。謝謝喵&#xff01;(&#xff65;ω&#xff65;) 題外話&#xff1a;泛型的概念非常非常非常重要&#xff01;&#xff01;&#xff01;整個第10章全都是Rust的重難點&#xff01;&#xf…

Spark-Streaming有狀態計算

一、上下文 《Spark-Streaming初識》中的NetworkWordCount示例只能統計每個微批下的單詞的數量&#xff0c;那么如何才能統計從開始加載數據到當下的所有數量呢&#xff1f;下面我們就來通過官方例子學習下Spark-Streaming有狀態計算。 二、官方例子 所屬包&#xff1a;org.…

Python 3 輸入與輸出指南

文章目錄 1. 輸入與 input()示例&#xff1a;提示&#xff1a; 2. 輸出與 print()基本用法&#xff1a;格式化輸出&#xff1a;使用 f-string&#xff08;推薦&#xff09;&#xff1a;使用 str.format()&#xff1a;使用占位符&#xff1a; print() 的關鍵參數&#xff1a; 3.…

【SQLi_Labs】Basic Challenges

什么是人生&#xff1f;人生就是永不休止的奮斗&#xff01; Less-1 嘗試添加’注入&#xff0c;發現報錯 這里我們就可以直接發現報錯的地方&#xff0c;直接將后面注釋&#xff0c;然后使用 1’ order by 3%23 //得到列數為3 //這里用-1是為了查詢一個不存在的id,好讓第一…

Swift Combine 學習(四):操作符 Operator

Swift Combine 學習&#xff08;一&#xff09;&#xff1a;Combine 初印象Swift Combine 學習&#xff08;二&#xff09;&#xff1a;發布者 PublisherSwift Combine 學習&#xff08;三&#xff09;&#xff1a;Subscription和 SubscriberSwift Combine 學習&#xff08;四&…

時間序列預測算法---LSTM

目錄 一、前言1.1、深度學習時間序列一般是幾維數據&#xff1f;每個維度的名字是什么&#xff1f;通常代表什么含義&#xff1f;1.2、為什么機器學習/深度學習算法無法處理時間序列數據?1.3、RNN(循環神經網絡)處理時間序列數據的思路&#xff1f;1.4、RNN存在哪些問題? 二、…

leetcode題目(3)

目錄 1.加一 2.二進制求和 3.x的平方根 4.爬樓梯 5.顏色分類 6.二叉樹的中序遍歷 1.加一 https://leetcode.cn/problems/plus-one/ class Solution { public:vector<int> plusOne(vector<int>& digits) {int n digits.size();for(int i n -1;i>0;-…

快速上手LangChain(三)構建檢索增強生成(RAG)應用

文章目錄 快速上手LangChain(三)構建檢索增強生成(RAG)應用概述索引阿里嵌入模型 Embedding檢索和生成RAG應用(demo:根據我的博客主頁,分析一下我的技術棧)快速上手LangChain(三)構建檢索增強生成(RAG)應用 langchain官方文檔:https://python.langchain.ac.cn/do…

[cg] android studio 無法調試cpp問題

折騰了好久&#xff0c;native cpp庫無法調試問題&#xff0c;原因 下面的Deploy 需要選Apk from app bundle!! 另外就是指定Debug type為Dual&#xff0c;并在Symbol Directories 指定native cpp的so路徑 UE項目調試&#xff1a; 使用Android Studio調試虛幻引擎Android項目…

【Windows】powershell 設置執行策略(Execution Policy)禁止了腳本的運行

報錯信息&#xff1a; 無法加載文件 C:\Users\11726\Documents\WindowsPowerShell\profile.ps1&#xff0c;因為在此系統上禁止運行腳本。有關詳細信息&#xff0c;請參 閱 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 所在位置 行:1 字符…

可編輯37頁PPT |“數據湖”構建汽車集團數據中臺

薦言分享&#xff1a;隨著汽車行業智能化、網聯化的快速發展&#xff0c;數據已成為車企經營決策、優化生產、整合供應鏈的核心資源。為了在激烈的市場競爭中占據先機&#xff0c;汽車集團亟需構建一個高效、可擴展的數據管理平臺&#xff0c;以實現對海量數據的收集、存儲、處…

【快速實踐】類激活圖(CAM,class activation map)可視化

類激活圖可視化&#xff1a;有助于了解一張圖像的哪一部分讓卷積神經網絡做出了最終的分類決策 對輸入圖像生成類激活熱力圖類激活熱力圖是與特定輸出類別相關的二維分數網格&#xff1a;對任何輸入圖像的每個位置都要進行計算&#xff0c;它表示每個位置對該類別的重要程度 我…

ros2 py文件間函數調用

文章目錄 寫在前面的話生成python工程包命令運行python函數命令python工程包的目錄結構目錄結構&#xff08;細節&#xff09; 報錯 1&#xff08; no module name ***&#xff09;錯誤示意 截圖終端輸出解決方法 報錯 2&#xff08; AttributeError: *** object has no attrib…

Milvus×合邦電力:向量數據庫如何提升15%電價預測精度

01. 全球能源市場化改革下的合邦電力 在全球能源轉型和市場化改革的大背景下&#xff0c;電力交易市場正逐漸成為優化資源配置、提升系統效率的關鍵平臺。電力交易通過市場化手段&#xff0c;促進了電力資源的有效分配&#xff0c;為電力行業的可持續發展提供了動力。 合邦電力…

OLED的顯示

一、I2C I2C時序&#xff1a;時鐘線SCL高電平下&#xff1a;SDA由高變低代表啟動信號&#xff0c;開始發送數據&#xff1b;SCL高電平時&#xff0c;數據穩定&#xff0c;數據可以被讀走&#xff0c;開始進行讀操作&#xff0c;SCL低電平時&#xff0c;數據發生改變&#xff1…

VMware運維效率提升50%,RVTools管理更簡單

RVTools 是一款專為 VMware 虛擬化環境量身打造的高效管理工具&#xff0c;基于 .NET 4.7.2 框架開發&#xff0c;并與 VMware vSphere Management SDK 8.0 和 CIS REST API 深度集成&#xff0c;能夠全面呈現虛擬化平臺的各項關鍵數據。該工具不僅能夠詳細列出虛擬機、CPU、內…

JS 中 json數據 與 base64、ArrayBuffer之間轉換

JS 中 json數據 與 base64、ArrayBuffer之間轉換 json 字符串進行 base64 編碼 function jsonToBase64(json) {return Buffer.from(json).toString(base64); }base64 字符串轉為 json 字符串 function base64ToJson(base64) {try {const binaryString atob(base64);const js…

介紹 C++ 中的智能指針及其應用:以 PyTorch框架自動梯度AutogradMeta為例

介紹 C 中的智能指針及其應用&#xff1a;以 AutogradMeta 為例 在 C 中&#xff0c;智能指針&#xff08;Smart Pointer&#xff09;是用于管理動態分配內存的一種工具。它們不僅自動管理內存的生命周期&#xff0c;還能幫助避免內存泄漏和野指針等問題。在深度學習框架如 Py…