Web 安全

網站包含多種不同型別的資訊。其中一些是非敏感的,例如公共頁面上顯示的文字。另一些是敏感的,例如客戶使用者名稱、密碼和銀行資訊,或內部演算法和私人產品資訊。

敏感資訊需要受到保護,這也是 Web 安全的重點。如果這些資訊落入不法分子手中,可能會被用於:

  • 透過與競爭對手分享公司的資訊,使其處於競爭劣勢。
  • 停用或劫持他們的服務,再次給他們的運營造成嚴重問題。
  • 危及客戶的隱私,使他們容易受到畫像、定向、資料丟失、身份盜竊甚至經濟損失的影響。

現代瀏覽器已經具備多項功能來保護使用者的 Web 安全,但開發人員也需要遵循最佳實踐並謹慎編碼,以確保他們的網站安全。即使程式碼中存在簡單的錯誤也可能導致漏洞,不法分子可以利用這些漏洞竊取資料並獲得對服務的未經授權的控制。

本文介紹了 Web 安全,包括概念資訊,以幫助您瞭解網站漏洞以及如何保護它們的實用指南。

安全與隱私的關係

安全與隱私是不同但密切相關的概念。瞭解兩者之間的區別以及它們如何關聯是值得的。

  • 安全是指保護私人資料和系統免受未經授權的訪問。這包括公司(內部)資料以及使用者和合作夥伴(外部)資料。

  • 隱私是指讓使用者控制其資料的收集、儲存和使用方式,同時確保資料不會被不負責任地使用。例如,您應該讓使用者知道您正在從他們那裡收集哪些資料,將與哪些方共享資料,以及將如何使用資料。使用者必須有機會同意您的隱私政策,訪問您儲存的他們的資料,並選擇刪除資料。

良好的安全性是良好隱私的基石。您可以遵循我們《Web 隱私》指南中列出的所有建議,但如果您的網站不安全,攻擊者仍然可以竊取資料,那麼秉持誠信和擁有健全的隱私政策都是徒勞的。

瀏覽器提供的安全功能

Web 瀏覽器遵循嚴格的安全模型,該模型對內容、瀏覽器和伺服器之間的連線以及資料傳輸實施強有力的安全措施。本節將介紹構成此模型基礎的功能。

同源策略和 CORS

同源策略是 Web 的一項基本安全機制,它限制了從一個載入的文件或指令碼如何與來自另一個源的資源進行互動。它有助於隔離潛在的惡意文件,減少可能的攻擊向量。

通常,來自一個源的文件不能向其他源發出請求。這是有道理的,因為您不希望網站能夠相互干擾並訪問未經授權的資料。

但是,在某些情況下,您可能希望放寬此限制;例如,如果您有多個網站相互互動,您可以使用fetch()允許它們相互請求資源。這可以透過跨域資源共享 (CORS)來實現。CORS 是一種基於 HTTP 頭的機制,允許伺服器指示瀏覽器應該允許從其自身以外的任何源(域、方案或埠)載入資源。

HTTP 通訊模型

Web 瀏覽器和伺服器使用HTTP協議相互通訊,請求資源,提供響應(例如,提供請求的資源或詳細說明請求失敗的原因),併為該通訊提供安全功能。

傳輸層安全 (TLS) 透過在網路傳輸過程中加密資料來提供安全和隱私,它是 HTTPS 協議背後的技術。TLS 有利於隱私,因為它阻止第三方攔截傳輸的資料並惡意使用。

所有瀏覽器都正在預設要求 HTTPS;這實際上已經成為事實,因為如果沒有此協議,您在 Web 上幾乎無法做任何事情。

相關主題

傳輸層安全 (TLS)

TLS 協議是使兩個聯網應用程式或裝置能夠私密且可靠地交換資訊的標準。使用 TLS 的應用程式可以選擇其安全引數,這可能對資料的安全性和可靠性產生重大影響。

HTTP 嚴格傳輸安全

Strict-Transport-Security HTTP 頭允許網站指定只能使用 HTTPS 訪問。

證書透明度

證書透明度 (CT) 是一個開放框架,旨在防止和監控證書錯誤頒發。新頒發的證書被“記錄”到公開執行的、通常是獨立的 CT 日誌中。這些日誌提供了僅追加的、經過加密驗證的已頒發 TLS 證書記錄。

混合內容

包含使用明文 HTTP 獲取的內容的 HTTPS 頁面稱為混合內容頁面。這類頁面只被部分加密,使未加密的內容容易被嗅探者和中間人攻擊者訪問。

弱簽名演算法

用於數字證書簽名的雜湊演算法的強度是證書安全的關鍵要素。一些簽名演算法已知較弱,應在適當情況下避免使用。

安全上下文和功能許可權

瀏覽器以不同方式控制“強大功能”的使用。這些“強大功能”包括在網站上生成系統通知、使用使用者的網路攝像頭訪問媒體流、作業系統 GPU 和使用網路支付。如果一個網站可以不受限制地使用控制這些功能的 API,惡意開發人員可能會嘗試執行以下操作:

  • 透過不必要的通知和其他 UI 功能騷擾使用者。
  • 在不發出警告的情況下開啟他們的網路攝像頭,以監視他們。
  • 堵塞他們的瀏覽器/系統以製造拒絕服務 (DoS) 攻擊。
  • 竊取資料或金錢。

這些“強大功能”透過以下方式進行控制:

  • 此類功能的使用僅限於安全上下文。安全上下文是windowworker,其中有充分的理由相信內容已安全傳輸(透過 HTTPS/TLS)。在安全上下文中,與安全的上下文通訊的可能性受到限制。安全上下文還有助於防止中間人攻擊者訪問強大功能。

    要檢視僅在安全上下文中可用的 Web 平臺功能列表,請參閱限制在安全上下文中的功能

  • 這些功能的使用受使用者許可權系統限制:使用者必須明確選擇提供對此類功能的訪問許可權,這意味著它們不能自動使用。使用者許可權請求會自動發生,您可以使用許可權 API查詢 API 許可權的狀態。

  • 其他幾個瀏覽器功能只能響應使用者操作(例如點選按鈕)才能使用,這意味著它們需要從適當的事件處理程式內部呼叫。這稱為瞬時啟用。有關更多資訊,請參閱受使用者啟用限制的功能

高階安全注意事項

Web 安全的許多方面都需要在伺服器端和客戶端進行考慮。本節主要關注客戶端安全注意事項。您可以從伺服器端角度找到有用的安全摘要,其中還包括要防範的常見攻擊的描述,請參閱網站安全(作為我們伺服器端網站程式設計學習模組的一部分)。

負責任地儲存客戶端資料

負責任地處理資料主要涉及減少第三方 Cookie 的使用,並謹慎對待您儲存和共享給它們的資料。傳統上,Web 開發人員使用 Cookie 儲存各種資料,攻擊者很容易利用這種趨勢。因此,瀏覽器已開始限制您對跨站點 Cookie 的操作,目標是在未來完全取消對其的訪問。

您應該透過限制您依賴的跟蹤活動數量和/或透過以其他方式實現所需資訊的永續性來為移除跨站點 Cookie 做準備。有關更多資訊,請參閱從第三方 Cookie 過渡替換第三方 Cookie

保護使用者身份並管理登入

當實施涉及資料收集的安全解決方案時,特別是如果資料是敏感的(例如登入憑據),使用信譽良好的解決方案是有意義的。例如,任何有聲望的伺服器端框架都將具有內建功能,以防止常見的漏洞。您還可以考慮為您的目的使用專門的產品,例如身份提供商解決方案或安全的線上調查提供商。

如果您想自行開發收集使用者資料的解決方案,請確保您瞭解所有方面和要求。聘請經驗豐富的伺服器端開發人員和/或安全工程師來實施系統,並確保對其進行徹底測試。使用多因素身份驗證 (MFA) 提供更好的保護。考慮使用專用 API,例如Web 身份驗證聯邦憑證管理來簡化應用程式的客戶端。

以下是一些提供安全登入的其他提示:

  • 在收集使用者登入資訊時,強制使用強密碼,以便您的使用者帳戶詳細資訊不易被猜測。弱密碼是安全漏洞的主要原因之一。此外,鼓勵您的使用者使用密碼管理器,以便他們可以使用更復雜的密碼,無需擔心記住它們,並且不會透過寫下它們而造成安全風險。另請參閱我們關於不安全密碼的文章。

  • 您還應該教育您的使用者有關網路釣魚的知識。網路釣魚是指向使用者傳送一條訊息(例如,電子郵件或簡訊),其中包含一個連結,該連結指向一個看起來像他們每天使用的網站但實際上不是的網站。該連結附帶一條訊息,旨在誘騙使用者在該網站上輸入其使用者名稱和密碼,以便攻擊者可以竊取這些資訊並將其用於惡意目的。

    注意:有些網路釣魚網站可能非常複雜,難以與真實網站區分開來。因此,您應該教育使用者不要信任電子郵件和簡訊中的隨機連結。如果他們收到“緊急,您需要立即登入以解決問題”之類的訊息,他們應該在新選項卡中直接訪問該網站並嘗試直接登入,而不是點選訊息中的連結。或者他們可以打電話或傳送電子郵件給您討論他們收到的訊息。

  • 透過速率限制、在一定數量的嘗試失敗後鎖定帳戶以及CAPTCHA 驗證碼來防範登入頁面的暴力攻擊。

  • 使用唯一的會話 ID 管理使用者登入會話,並在一段時間不活動後自動登出使用者。

不要在 URL 查詢字串中包含敏感資料

通常,您不應在 URL 查詢字串中包含敏感資料,因為如果第三方截獲了 URL(例如,透過Referer HTTP 頭),他們可能會竊取該資訊。更嚴重的是,這些 URL 可以被公共網路爬蟲、HTTP 代理和歸檔工具(例如網際網路檔案)索引,這意味著您的敏感資料可能會在公共可訪問資源上持久存在。

使用 POST 請求而不是 GET 請求來避免這些問題。我們的文章Referer 頭策略:隱私和安全問題更詳細地描述了與 Referer 頭相關的隱私和安全風險,並提供了緩解這些風險的建議。

注意:避免透過 GET 請求在 URL 中傳輸敏感資料也有助於防範跨站請求偽造重放攻擊

強制執行使用策略

考慮使用 Web 平臺功能,例如內容安全策略 (CSP) 和許可權策略,以在您的網站上強制執行一套功能和資源使用規則,從而更難引入漏洞。

CSP 允許您新增一層安全性,例如,只允許從特定的受信任來源載入影像或指令碼。這有助於檢測和緩解某些型別的攻擊,包括跨站指令碼 (XSS) 和資料注入攻擊。這些攻擊涉及一系列惡意活動,包括資料竊取、網站篡改和惡意軟體分發。

許可權策略以類似的方式工作,只不過它更關注允許或阻止訪問特定的“強大功能”(如前所述)。

注意:此類策略對於維護網站安全非常有用,特別是當您在網站上使用大量第三方程式碼時。但是,請記住,如果您阻止第三方指令碼依賴的某個功能,您最終可能會破壞網站的功能。

維護資料完整性

在上一節的基礎上,當您允許在您的網站上使用功能和資源時,您應該嘗試確保資源未被篡改。

相關主題

子資源完整性

子資源完整性 (SRI) 是一項安全功能,它使瀏覽器能夠驗證它們獲取的資源(例如,來自CDN)是否在沒有意外篡改的情況下交付。它的工作原理是允許您提供一個加密雜湊,獲取的資源必須匹配該雜湊。

HTTP Access-Control-Allow-Origin

Access-Control-Allow-Origin 響應頭表示是否可以將響應與來自給定的請求程式碼共享。

HTTP X-Content-Type-Options

X-Content-Type-Options 響應頭是伺服器用來指示在 Content-Type 頭中宣告的 MIME 型別不應更改並且必須遵循的標記。此頭是選擇退出 MIME 型別嗅探的一種方式,換句話說,是指定 MIME 型別是經過有意配置的。

清理表單輸入

通常,不要相信使用者在表單中輸入的任何內容。線上填寫表單既複雜又繁瑣,使用者很容易輸入不正確的資料或格式錯誤的資料。此外,惡意人員擅長在表單欄位中輸入特定的可執行程式碼字串(例如,SQL 或 JavaScript)。如果您不小心處理此類輸入,它們可能會在您的網站上執行有害程式碼或刪除您的資料庫。有關這種情況如何發生的良好示例,請參閱SQL 注入

為了防止這種情況,您應該徹底清理輸入到表單中的資料:

  • 您應該實施客戶端驗證,以便在使用者輸入格式錯誤的資料時通知他們。您可以使用內建的 HTML 表單驗證功能來完成此操作,也可以編寫自己的驗證程式碼。有關更多資訊,請參閱客戶端表單驗證
  • 在應用程式 UI 中顯示使用者輸入時,您應該使用輸出編碼,以安全地顯示使用者輸入的原始資料,並避免將其作為程式碼執行。有關更多資訊,請參閱輸出編碼

您不能僅僅依靠客戶端驗證來確保安全性——它應該與伺服器端驗證結合使用。客戶端驗證透過提供即時驗證反饋而無需等待往返伺服器來增強使用者體驗。然而,惡意方很容易繞過客戶端驗證(例如,透過關閉瀏覽器中的 JavaScript 來繞過基於 JavaScript 的驗證)。

任何信譽良好的伺服器端框架都將提供驗證表單提交的功能。此外,一個常見的最佳實踐是轉義構成可執行語法部分的任何特殊字元,從而使輸入的任何程式碼不再可執行並被視為純文字。

防範點選劫持

點選劫持攻擊中,使用者被誘騙點選一個執行與使用者預期不同的操作的 UI 元素,這通常會導致使用者的機密資訊傳遞給惡意第三方。這種風險是嵌入式第三方內容固有的,因此請確保您信任嵌入到您網站中的內容。此外,請注意點選劫持可以與網路釣魚技術結合使用。您可以在上一節保護使用者身份和管理登入中閱讀有關網路釣魚的內容。

以下功能可以幫助防範點選劫持:

HTTP X-Frame-Options

X-Frame-Options HTTP 響應頭可用於指示瀏覽器是否應該被允許在 <frame><iframe><embed><object> 中渲染頁面。網站可以使用此功能來避免點選劫持攻擊,透過確保其內容不嵌入到其他網站中。

CSP: frame-ancestors

HTTP Content-Security-Policy (CSP) 的 frame-ancestors 指令指定了可以使用 <frame><iframe><object><embed> 嵌入頁面的有效父級。

實用安全實施指南

要獲取在網站上有效實施安全功能並確保遵循最佳實踐的全面說明,請參閱我們的實用安全實施指南

其中一些指南與HTTP Observatory工具直接相關。Observatory 對網站進行安全審計,並提供等級和分數以及修復其發現的安全問題的建議。這些指南解釋瞭如何解決 MDN Observatory 測試發現的問題:該工具會連結到每個問題的相關指南,幫助您找到有效的解決方案。有趣的是,Mozilla 的內部開發團隊在實施網站時會使用這些指南,以確保應用了安全最佳實踐。

另見