2010-11-23 16 views
1

爲了防止我的應用程序崩潰,出現錯誤「檢測到有潛在危險的Request.Form值...」,我只關閉了頁面驗證。我想重新訪問並正確解決。自動編碼文本輸入的策略?

有沒有一個很好的策略呢?如果人們輸入'<'和'>',我認爲保存數據的唯一方法是通過Javacript對其進行編碼。我曾嘗試在代碼隱藏中捕獲它,但它太遲了。我正在考慮繼承文本框並使用客戶端腳本自動編碼/解碼輸入。我還必須考慮已經保存在我的數據庫中的所有尖括號。

任何建議或經驗呢?

回答

0

您可以在發佈數據之前逃離危險字符重複。就像這樣:

string = escape(string); 

,然後在服務器端:

var stringVal = Server.UrlDecode(Request["string"]); 

類似的東西。

0

你有沒有用,

Server.HtmlEncode(input) 

沒有真正需要使用JavaScript做在客戶端考慮。您可以使用上述技術輕鬆在服務器端完成此操作。

,可能是this問題 /BB

+1

在生命週期的哪個部分,你會這樣做,因爲無論我在哪裏嘗試,都會產生「潛在危險......」。我覺得客戶端是處理這個問題的唯一方法(?) – TruMan1 2010-11-23 13:15:51

1

我從你的回答中得知,你不希望你的客戶向你發送「危險的」內容,所以它最好離開頁面驗證,作爲最後一道防線,而不是關閉並使用Server.HtmlEncode每個用戶輸入值(你可能會錯過一個,這是很多工作)。

我會去一個JavaScript解決方案,例如你可以使用一個庫,如jQuery,並掛鉤到表單的提交事件,並在提交前整理輸入。比創建自己的派生文本框要乾淨得多。

對於沒有使用javascript的用戶,或者試圖「破解」你的小腳本,他們將達到你的最後一道防線,並得到一個錯誤。

1

最好將內置頁面驗證視爲不適用於所有情況的安全設備。有很多次,當它打開時完全不可能做某些事情。在這些情況下,我們將其關閉,並自行處理驗證。

最明顯的例子是,有時候我們實際上想要發送大塊的HTML到服務器。當然,這樣做仍然需要保證安全,但「哦,看起來像是一大塊HTML!拋出一個安全異常!」顯然不是正確的做法。

因此,在這些情況下,關閉頁面驗證並添加您自己的服務器端是非常明智的。這確實意味着你必須考慮如何使用這個輸入和比以前更仔細的審查。按照每個數據輸入的路徑(不僅僅是那些你期望看到像<這樣的字符的地方),並確保它不會被髮送回客戶端,也不會被徹底檢查以確保安全。