說明:ASP.NET 在請求中檢測到包含潛在危險的數據,由於它可能包括 HTML 標記或腳本。該數據可能表示存在危及應用程序安全的嘗試,如跨站點腳本攻擊。若是此類型的輸入適用於您的應用程序,則可包括明確容許的網頁中的代碼。有關詳細信息,請參閱 http://go.microsoft.com/fwlink/?LinkID=212874。
異常詳細信息:System.Web.HttpRequestValidationException: 從客戶端(newsContent="<p>
後臺測試後臺測試</p>
")中檢測到有潛在危險的 Request.Form 值。javascript
出現這個狀況一般都是因爲在表單中輸入了html標籤。ASP.Net 1.1後引入了對提交表單自動檢查是否存在XSS(跨站腳本攻擊)的能力。當用戶試圖用之類的輸入影響頁面返回結果的時候,ASP.Net的引擎會引起一個 HttpRequestValidationExceptioin。這是ASP.Net提供的一個很重要的安全特性。由於不少程序員對安全沒有概念,甚至都不知道XSS這種攻擊的存在,知道主動去防禦的就更少了。ASP.Net在這一點上作到默認安全。這樣讓對安全不是很瞭解的程序員依舊能夠寫出有必定安全防禦能力的網站。html
可是當某些特殊狀況必須須要輸入這些標籤的時候就不但願報這個錯誤了。java
因而就出現了下面些個解決方案。程序員
<%@ Page validateRequest="false" %>
若是是ASP.NET MVC項目則在對應的action上面加上web
[ValidateInput(false)]
<configuration> <system.web> <pages validateRequest="false" /> </system.web> </configuration>
由於validateRequest默認值爲true。只要設爲false便可。c#
在ASP.NET4.0的狀況下,須要注意一點是:在Web.Config文件中的配置節</system.web>以前加上以下一句配置安全
<httpRuntime requestValidationMode="2.0" />
另外,這些方法雖然能夠解決問題,可是卻不是最佳的解決方案。編輯器
下面說說最好的方法函數
正確的作法是在你當前頁面添加Page_Error()函數,來捕獲全部頁面處理過程當中發生的而沒有處理的異常。而後給用戶一個合法的報錯信息。若是當前頁面沒有Page_Error(),這個異常將會送到Global.asax的Application_Error()來處理,你也能夠在那裏寫通用的異常報錯處理函數。若是兩個地方都沒有寫異常處理函數,纔會顯示這個默認的報錯頁面呢。測試
舉例而言,處理這個異常其實只須要很簡短的一小段代碼就夠了。在頁面的Code-behind頁面中加入這麼一段代碼:
這樣這個程序就能夠截獲 HttpRequestValidationException 異常,並且能夠按照程序員的意願返回一個合理的報錯信息。
這段代碼很簡單,因此我但願全部不是真的要容許用戶輸入之類字符的朋友,千萬不要隨意的禁止這個安全特性,若是隻是須要異常處理,那麼請用相似於上面的代碼來處理便可。
而對於那些經過 明確禁止了這個特性的程序員,本身必定要明白本身在作什麼,並且必定要本身手動的檢查必須過濾的字符串,不然你的站點很容易引起跨站腳本攻擊。
關於存在Rich Text Editor的頁面應該如何處理?
若是頁面有富文本編輯器的控件的,那麼必然會致使有類的HTML標籤提交回來。在這種狀況下,咱們不得不將validateRequest="false"。那麼安全性怎麼處理?如何在這種狀況下最大限度的預防跨站腳本攻擊呢?
根據微軟的建議,咱們應該採起安全上稱爲「默認禁止,顯式容許」的策略。
首先,咱們將輸入字符串用 HttpUtility.HtmlEncode()來編碼,將其中的HTML標籤完全禁止。
而後,咱們再對咱們所感興趣的、而且是安全標籤,經過Replace()進行替換。好比,咱們但願有""標籤,那麼咱們就將""顯式的替換回""。
這樣咱們即容許了部分HTML標籤,又禁止了危險的標籤。