簡體   English   中英

如何在允許 HTML 輸入的同時防止 XSS(跨站點腳本)

[英]How to prevent XSS (Cross Site Scripting) whilst allowing HTML input

我有一個網站,允許通過TinyMCE豐富的編輯器控件輸入 HTML。 其目的是允許用戶使用 HTML 格式化文本。

然后將該用戶輸入的內容輸出給系統的其他用戶。

然而,這意味着有人可以將 JavaScript 插入 HTML 以便對系統的其他用戶執行 XSS 攻擊。

從 HTML 字符串中過濾掉 JavaScript 代碼的最佳方法是什么?

如果我對<SCRIPT>標簽執行正則表達式檢查,這是一個好的開始,但作惡者仍然可以將 JavaScript 附加到標簽的onclick屬性。

是否有一種萬無一失的方法來編寫所有 JavaScript 代碼,同時保持 HTML 的 rest 不變?

對於我的特定實現,我使用的是 C#

微軟已經制作了自己的反 XSS 庫, Microsoft Anti-Cross Site Scripting Library V4.0

Microsoft Anti-Cross Site Scripting Library V4.0 (AntiXSS V4.0) 是一個編碼庫,旨在幫助開發人員保護其 ASP.NET 基於 Web 的應用程序免受 XSS 攻擊。 它與大多數編碼庫的不同之處在於它使用白名單技術(有時稱為包含原則)來提供針對 XSS 攻擊的保護。 這種方法的工作原理是首先定義一組有效或允許的字符,然后對該組之外的任何內容(無效字符或潛在攻擊)進行編碼。 白名單方法提供了優於其他編碼方案的幾個優點。 New features in this version of the Microsoft Anti-Cross Site Scripting Library include:- A customizable safe list for HTML and XML encoding- Performance improvements- Support for Medium Trust ASP.NET applications- HTML Named Entity Support- Invalid Unicode detection- Improved Surrogate Character Support對於 HTML 和 XML 編碼 - LDAP 編碼改進 - application/x-www-form-urlencoded 編碼支持

它使用白名單方法去除潛在的 XSS 內容。

以下是與AntiXSS相關的一些相關鏈接:

彼得,我想向您介紹安全方面的兩個概念;

黑名單 - 禁止您知道不好的事情。

白名單 - 允許您知道是好的事情。

雖然兩者都有其用途,但黑名單在設計上是不安全的。

你問的是,實際上是黑名單。 如果必須有<script>的替代方案(例如<img src="bad" onerror="hack()"/> ),您將無法避免此問題。

另一方面,白名單允許您指定您允許的確切條件。

例如,您將有以下規則:

  • 只允許這些標簽:b、i、u、img
  • 只允許這些屬性:src、href、style

這只是理論。 在實踐中,您必須相應地解析 HTML,因此需要適當的 HTML 解析器。

如果你想允許一些 HTML 但不是全部,你應該使用類似 OWASP AntiSamy 的東西,它允許你為你允許的標簽和屬性建立一個白名單策略。

HTMLPurifier 也可能是一個替代方案。

至關重要的是,它是一種白名單方法,因為 HTML5 一直在添加新的屬性和事件,因此任何黑名單都會在短時間內失敗,並且了解所有“壞”屬性也很困難。

編輯:哦,正則表達式在這里有點難做。 HTML 可以有很多不同的格式。 標簽可以是未閉合的,屬性可以以引號開頭或不帶引號(單引號或雙引號),您可以在標簽內有換行符和各種空格,僅舉幾例。 我會依賴像我上面提到的那些經過良好測試的庫。

正則表達式是錯誤的工具,你需要一個真正的 HTML 解析器,否則事情會變糟。 您需要解析 HTML 字符串,然后刪除除允許的元素和屬性之外的所有元素和屬性(白名單方法,黑名單本質上是不安全的)。 您可以將Mozilla 使用的列表作為起點。 There you also have a list of attributes that take URL values - you need to verify that these are either relative URLs or use an allowed protocol (typically only http: / https: / ftp: , in particular no javascript: or data: ). 刪除所有不允許的內容后,您可以將數據序列化回 HTML - 現在您可以安全地在 web 頁面上插入一些內容。

我嘗試像這樣替換標簽元素格式:

public class Utility
{
    public static string PreventXSS(string sInput) {
        if (sInput == null)
            return string.Empty;
        string sResult = string.Empty;
        sResult = Regex.Replace(sInput, "<", "< ");
        sResult = Regex.Replace(sResult, @"<\s*", "< ");
        return sResult;
    }
}

保存到數據庫之前的用法:

    string sResultNoXSS = Utility.PreventXSS(varName)

我已經測試我有輸入數據,如:

<script>alert('hello XSS')</script>

在此處輸入圖像描述

它將在瀏覽器上運行。 添加 Anti XSS 后,上面的代碼將是:

< script>alert('hello XSS')< /script>

<后面有一個空格)

結果,腳本不會在瀏覽器上運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM