目前做ASP.NET項目的時候就有遇到過“用戶代碼未處理HttpRequestValidationException:從客戶端***中檢測到有潛在危險的 Request.Form/Request.QueryString值。”的問題,其實這是ASP.NET對於XSS攻擊的一種防御手段,防止惡意的HTML標記或腳本數據注入到網站中。
遇到這種問題,我百度了一下,看了大神寫的博客,於是轉載+備份。
要解決這個問題需要對應多種情況,並且有多種方法來解決。在ASP.NET WebForm項目中可以對單獨頁面或者全局頁面進行處理。
方法一:在出現問題的頁面中,設置頭部Page的屬性ValidateRequest=false,代碼如下:
<%@ Page Language="C#" ValidateRequest="false" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication13.WebForm1" %>
MSDN關於ValidateRequest屬性的描述:如果 ASP.NET 針對危險值檢查來自瀏覽器的輸入,則為 true;否則為 false。 默認值為 true。
方法二:在配置文件中 設置system.web 節點下pages節點的validateRequest="false",代碼如下:
<system.web> <pages validateRequest="false"></pages> <httpRuntime requestValidationMode="2.0"/> </stytem.web>
注意:
1、方法二要慎用,方法二是全局配置,一旦關閉了全站的請求驗證,網站就很有可能受到各種攻擊以及接受許多危險的數據,比如最常見的XSS攻擊。
2、方法一和方法二設置生效都有一個前提,就是配置文件中的httpRuntime 節點的驗證模式必須為2.0,.Net Framework4.0版本以上的項目,不設置的話默認驗證模式是4.0,4.0的驗證模式ValidateRequest=false將會無效,除非 你的ASP.NET項目使用的還是.NET 4.0以下的框架。
代碼如下:
<system.web> <httpRuntime requestValidationMode="2.0"/> </stytem.web>
總結MSDN的資料,概括來說就是4.0的驗證模式默認是全站HTTP請求都會進行驗證,包括COOKIE請求、.ashx一般處理程序請求都會進行驗證。而2.0的模式只是針對當前的.aspx頁面,這里看下微軟MSDN上的說明:
RequestValidationMode 屬性指定要使用的 ASP.NET 驗證方法。 這可以是在 ASP.NET 版本(早於版本 4)中或在 .NET Framework 4 中使用的版本中使用的算法。 可以將屬性設置為下列值: 4.0(默認)。 HttpRequest 對象在內部設置一個標志,該標志指示每當訪問 HTTP 請求數據時應觸發請求驗證。 這可保證在請求期間訪問數據(如 cookie 和 URL)之前觸發請求驗證。 配置文件中頁元素(如果有的話)的請求驗證設置或單獨頁面中的 @ 頁指令的請求驗證設置將被忽略。 2.0. 僅對網頁(而不是對所有 HTTP 請求)啟用請求驗證。 此外,配置文件中的 pages 元素(如果有的話)的請求驗證設置或單獨頁中的 @ Page 指令的請求驗證設置用來確定要驗證哪些頁請求。 未驗證分配給此屬性的值是否匹配特定版本的 ASP.NET。 任何小於 4.0(例如 3.7、2.9 或 2.0)的數值將被解釋為 2.0。 任何大於 4.0 的數值將被解釋為 4.0。 若要在配置文件中設置此值,可以為 httpRuntime 元素的 requestValidationMode 特性賦值。 有關更多信息,請參見 httpRuntime 元素(ASP.NET 設置架構)。
3、方法一也是在特定環境下才可以取消驗證,對於用戶的輸入內容,必須要做好相對應的防御措施,基本的可以使用 HttpUtility.HtmlEncode()對用戶輸入文本進行編碼。當然推薦還是使用AntiXSS類庫,在.NET Framework4.5以上的版本已經將這個類庫包含進去,有興趣的朋友可以研究下System.Web.Security.AntiXss 命名空間。
另外一個就是ASP.NET MVC項目,MVC中比較簡單,只要在控制器上設置屬性ValidateInput(false)就行,例如:
[HttpPost] [ValidateInput(false)] public ActionResult Create(string strText) { /*此處省略代碼1000行……..*/ }
另外即使是ASP.NET MVC,也要在配置文件中設置驗證模式為2.0,否則設置也是無效的。