2010-09-20 39 views
4

我在需要接受HTML標記輸入的表單中有一個文本框。使用HTML編碼字符進行ASP.NET請求驗證

使用HTML標記提交輸入使應用程序拋出HttpRequestValidationException,除非我們使用HttpUtility.HtmlEncode。目前爲止很簡單。

但是,輸入也可能包含符號,例如「度」符號(°)。當這些也是HTML編碼時,它們變成數字轉義碼,在這個例子中爲°。這些代碼也會導致HttpRequestValidationException被拋出,但問題是爲什麼?

我不明白爲什麼數字轉義代碼被認爲是潛在的危險,尤其是°作爲輸入很好。

我似乎被卡住了,因爲輸入原樣由於標記而失敗,並且HTML編碼輸入由於數字轉義而失敗。我的解決方案到目前爲止一直是HTML編碼,然後正則表達式用他們的HTML解碼格式替換轉義序列,但我不知道這是否是一個安全的解決方案,因爲我認爲轉義序列被視爲危險的原因。

回答

5

ASP.NET認爲html char轉義(& #xxx)與其考慮角度括號危險的相同原因(即XSS)是危險的。使用上面的轉義,你可以包含任何字符(例如,斜角括號)。請求驗證在1.1和2.0中執行的請求的summary

在合法的情況下,如你的情況,你可以爲

  • 禁用請求驗證的頁面 水平(<%@頁 validateRequest =你所描述的選擇以下任何

    1. 選擇自己處理「false」)
    2. 在.NET 4中,使用RequestValidator類替換您自己的請求驗證。
  • +0

    當然可以,但爲什麼是任何容易包括斜角括號,其中'<'比'<'要好,或者只是輸入一個<並將它編碼爲'&lt;'? – jonnystoten 2010-09-20 11:31:55

    0

    我建議尋找在客戶端進行有限的html編碼,通過綁定處理到表單提交,與jquery相當輕而易舉。

    「限制」是什麼意思? &符號,尖括號和引號應該被編碼,而不是unicode符號。你指出,實際上,數字轉義代碼是邪惡的並且被拒絕,而不像它們的未轉義的等價物!

    你可以運行你通過類似下面的代碼JavaScript函數提交的字符串,給你的會通過請求驗證的值:

    function safeString(s) { 
        return s.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g, "&quot;"); 
    } 
    

    這可能會引起你一些悲痛,如果,存儲後它或者用提交的值做一些服務器端的魔法,你想要在輸入內重新顯示它。讓我詳細說明一下:如果你只是把一個字符串編碼成一個空白段落,它將會完美呈現;但是如果你把它轉儲到textarea中,你會看到& lt;代替<

    諷刺的是,寫的最後一句話我已經當鍵入&放大器; LT;& lt;分別...

    -2

    只需添加在你的頁面指令(該頁面的第一行),該屬性:

    ValidateRequest = 「假」

    +5

    只是一個重要的說明,通過這樣做您的頁面將容易受到攻擊,因此您應該替換跨頁腳本的任何不需要的標記。 – 2012-03-06 10:07:00

    +1

    此答案有與之相關的安全風險 – 2012-03-11 00:40:47

    +0

    我知道我說過在我上面的評論中,您是否閱讀過它? – 2012-03-11 01:49:36

    相關問題