ASP.NET 4.0中使用FreeTextBox和FCKeditor遇到安全問題警告的解決辦法

引言


本人在.NET 4.0+VS2010環境下調試一個ASP.NET 4.0程序時使用到富文本控件FreeTextBox 3.2.2。從網絡上查詢得到這個控件儘管被廣泛使用,但是其相關的安全問題需要自行解決。

我的問題


我的問題是在VS2010中使用FreeTextBox 3.2.2用於輔助發送郵件主體內容時,系統出現如下的錯誤提示:

 

A potentially dangerous Request.Form. value was detected from the client (FreeTextBox1="<H1>bbtest1</H1>").

Description:Request Validation has detected a potentially dangerous client input value, and processing of the request has been aborted. This value may indicate an attempt to compromise the security of your application, such as a cross-site scripting attack. To allow pages to override application request validation settings, set the requestValidationMode attribute in the httpRuntime configuration section to requestValidationMode="2.0". Example: <httpRuntime requestValidationMode="2.0" />. After setting this value, you can then disable request validation by setting validateRequest="false" in the Page directive or in the <pages> configuration section. However, it is strongly recommended that your application explicitly check all inputs in this case. For more information, see http://go.microsoft.com/fwlink/?LinkId=153133.

Exception Details:System.Web.HttpRequestValidationException: A potentially dangerous Request.Form. value was detected from the client (FreeTextBox1="<H1>bbtest1</H1>").


原因如上所示:我在郵件主體內容(即上面的富文本框中輸入具有樣式H1的測試文本“bbtest1”。


原因分析及解決辦法


ASP.Net 1.1後引入了對提交表單自動檢查是否存在XSS(跨站腳本攻擊)的能力。當用戶試圖用之類的輸入影響頁面返回結果的時候,ASP.Net的引擎會引發一個 HttpRequestValidationExceptioin。也就是說,頁面請求(request)時,含有html或javascript等字符串時。ASP.NET會認爲是危險的值,就會拋出辭異常。當頁面上使用了所見即所得編輯器(例如使用了fckeditor或FreeTextBox控件等)的時候會發生此異常。以下三種方法是針對ASP.NET 2.0或ASP.NET 3.5環境下的解決辦法。

解決方法一

在頁面上加入 <% Page ValidateRequest="false"  %>

解決方法二

修改Web.Config配置文件的<pages>標籤。<pages validateRequest="false">...</pages>。這個方法會將所有的頁面校驗功能去掉,所以不推薦使用此方法。  

解決方法三

捕獲異常,這樣你就可以自己來定義異常的提示方式。



ASP.NET 4.0請求驗證模式發生變化


ASP.NET請求驗證功能可以給我提供應用程序的安全保證,避免站點受到XSS的攻擊。但是在一些情況下,我們需要禁用這個功能,比如我們需要使用HtmlEditor來讓用戶輸入一些HTML文本,這時候ASP.NET 2.0允許我們可以通過在web.config設置validateRequest="false"。或者在MVC中,我們可以通過在 Controller或者Action上設置[ValidateRequest(false)]這個特性來達到禁用的上的。但是在當你把站點從舊版本升級到ASP.NET 4.0後,你會發現,即使你這樣做,仍然會提示你這樣的一個異常“A potentially dangerous Request.Form. value was detected from the client”。該如何來解決這個問題呢?

在之前的ASP.NET版本中,請求驗證是默認啓用的,但是它只對頁面請求有效(請求.aspx頁面),並且也只是在頁面被請求時驗證。但是在ASP.NET 4.0中,請求驗證功能被提前到IHttpHandler.BeginRequest這個方法被請求之前,這也就意味着所有進入ASP.NET請求通道的所有的HTTP請求都將會被進行請求內容合法性的驗證,包括有的自定義HttpHandler,WebService請求,甚至於利用自定義Http Module進行自定義請求處理程序。

請求驗證處理被提前的後果就是導致我們在頁面,或者Controller中設置 ValidateRequest=false,將會失效,無法阻止程序不去驗證請求的輸入內容了。因爲這樣做後,驗證器無法得到請求的頁面是否禁用了驗證請求,因爲還沒有實例化HttpHandler。

在ASP.NET4.0中,並沒有提供給我一個地方去禁用這個驗證功能。但是出於兼容性的考慮,ASP.NET允許我們通過在web.config中配置使用ASP.NET 2.0的請求驗證行爲:<httpRuntime requestValidationMode=”2.0″ />


關於FCKeditor

對於喜歡和FCKeditor的用戶應當也會遇到類似於上述的問題。“百度知道”有如下的問題,請參考:


:<httpRuntime requestValidationMode="2.0" />在哪設置?



使用FCKeditor後報錯:
"從客戶端中檢測到有潛在危險的 Request.Form. 值."
設置了 ValidateRequest="false"後還是報同樣錯誤:

說明: 請求驗證過程檢測到有潛在危險的客戶端輸入值,對請求的處理已經中止。
該值可能指示存在危及應用程序安全的嘗試,如跨站點腳本攻擊。
若要允許頁面重寫應用程序請求驗證設置,請將 httpRuntime 配置節中的 requestValidationMode 特性設置爲 requestValidationMode="2.0"。
示例: <httpRuntime requestValidationMode="2.0" />。
設置此值後,可通過在 Page 指令或 <pages> 配置節中設置 validateRequest="false" 禁用請求驗證。
但是,在這種情況下,強烈建議應用程序顯式檢查所有輸入。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章