從客戶端(content="xxxxx")中檢測到有潛在危險的 Request.Form 值——較合理解決方案


 

1,修改配置文件:

<httpRuntime requestValidationMode = "2.0" />

以上修改是必須的,因為高版本的.netframework

 

2,將需要提交危險字符的頁面,關閉驗證:

<%@ Page Language="C#" AutoEventWireup="true" ValidateRequest = "false"

增加了一個配置:ValidateRequest = "false"   表示關閉當前頁面的驗證;

 

3,你需要在后台對能預見的所有提交字段進行編碼,使用:HtmlEncode方法

注意:

1,你之所以關閉這個頁面的驗證,是因為你這個頁面需要給用戶提供提交“危險”字符的能力。

2,雖然給用戶提供了可以提交危險字符的功能,但是不代表不需要處理。其實更合理的方式是,對危險字符提前進行轉換,顯示時再轉換回去。比如用[]替換<>

 

很多人是在web.config直接關閉驗證功能是不合適的,這相當於關閉了asp.net框架提供的安全保護功能;

<pages validateRequest="false"></pages>

這個配置是最好不要用的。

 

 

 

資料:https://www.aspsnippets.com/Articles/A-potentially-dangerous-RequestForm-value-was-detected-from-the-client.aspx

關鍵字:A potentially dangerous Request.Form value was detected from the client

默認情況下,ASP.Net會驗證所有可能導致跨站點腳本和SQL注入的不安全內容的輸入控件。因此,它通過拋出上述異常來禁止此類內容。默認情況下,建議允許在每次回發時進行此檢查。

 

參考資料:https://www.c-sharpcorner.com/article/a-potentially-dangerous-request-form-value-was-detected-from-the-client/

 

參考資料:https://docs.microsoft.com/en-us/previous-versions/aspnet/hh882339(v=vs.110)?redirectedfrom=MSDN

文章標題:在ASP.NET中進行請求驗證

這個才是好的參考資料,非常全面。

請求驗證是ASP.NET中的一項功能,它檢查HTTP請求並確定它是否包含潛在的危險內容。在這種情況下,潛在的危險內容是請求的正文,標頭,查詢字符串或cookie中的任何HTML標記或JavaScript代碼。ASP.NET執行此檢查,因為可能出於惡意目的添加了URL查詢字符串,cookie或發布的表單值中的標記或代碼。

例如,如果您的網站具有用戶輸入評論的表單,則惡意用戶可以在script元素中輸入JavaScript代碼。當您向其他用戶顯示評論頁面時,瀏覽器將執行JavaScript代碼,就像該代碼是您的網站生成的一樣。此漏洞通常被稱為跨站點腳本(XSS)攻擊。

請求驗證有助於防止這種攻擊。如果ASP.NET在請求中檢測到任何標記或代碼,它將引發“檢測到潛在危險值”錯誤並停止頁面處理。

當檢測到任何HTML標記(包括無害的標記,如<b>(粗體)元素)時,請求驗證都會引發此異常。如果您希望您的應用程序接受HTML標記,則在這種情況下引發錯誤可能是一個問題。例如,如果您的站點允許用戶添加評論,則您可能希望通過使用HTML標記(使文本以粗體或斜體顯示)來使用戶添加基本格式。在這種情況下,您可以禁用請求驗證並手動檢查惡意內容。或者,您可以自定義請求驗證,以便接受某些類型的標記或腳本。有關如何自定義請求驗證的信息,請參見白皮書《ASP.NET 4中的安全性擴展》(PDF)。有關如何指定自定義錯誤頁面而不是默認錯誤頁面的信息,請參閱如何:處理應用程序級錯誤

安全說明安全須知

即使您正在使用請求驗證,您也應該在從頁面上獲得用戶輸入的文本之前,先對其進行HTML編碼。(除非您手動檢查了它的潛在惡意標記,如稍后所述。)有關如何對文本進行HTML編碼的信息,請參見博客條目ASP.NET 4中HTML編碼輸出的新<%:%>語法(和ASP.NET MVC 2),作者:Scott Guthrie。

禁用請求驗證

安全說明安全須知

如果禁用請求驗證,則必須檢查用戶自己輸入的危險HTML或JavaScript。有關更多信息,請參見本主題后面的“ 手動檢查請求”

用於禁用請求驗證的方法取決於您使用的ASP.NET Web應用程序類型:

  • ASP.NET Web表單

  • ASP.NET MVC

  • ASP.NET網頁

在ASP.NET Web表單(ASP.NET 4或更高版本)中禁用請求驗證

您可以禁用整個應用程序的請求驗證,但是不建議這樣做。建議僅針對要允許標記的虛擬路徑或特定頁面有選擇地禁用請求驗證。

無論哪種情況,您都必須在Web.config文件中進行兩項更改。第一個更改是將httpRuntime元素的requestValidationMode屬性設置為“ 2.0”。此設置使請求驗證在請求處理事件的順序中稍后發生。對於使用ASP.NET 4和更高版本的應用程序,此設置是必需的,因為從ASP.NET 4開始,請求驗證在請求生命周期中比在早期版本的ASP.NET中更早進行。

 XML格式

<system.web> <httpRuntime requestValidationMode="2.0" /> </system.web> 

下面的示例顯示如何使請求驗證稍后在單個頁面(在本例中為Test.aspx頁面)中發生:

XML格式
<location path="test.aspx"> <system.web> <httpRuntime requestValidationMode="2.0" /> </system.web> </location> 

第二個更改是將validationRequest設置為false。對於整個應用程序,您可以使用Web.config文件中的pages元素執行此操作,如以下示例所示。(僅當您還設置了requestValidationMode =“ 2.0”時,此設置才有效。)

XML格式
<configuration> <system.web> <pages validateRequest="false" /> </system.web> </configuration> 

對於單個頁面,可以在頁面的@ Page指令中將validationRequest設置為false,如以下示例所示:

的HTML
<@ Page validateRequest="false" %> 

在ASP.NET MVC中禁用請求驗證

若要在ASP.NET MVC應用程序中禁用請求驗證,您必須將請求驗證更改為在請求處理順序中的更早發生,如前面對ASP.NET Web窗體所述。在Web.config文件中,進行以下設置:

XML格式
<system.web> <httpRuntime requestValidationMode="2.0" /> </system.web> 

在ASP.NET MVC中,可以為請求中的操作方法,屬性或字段(輸入元素)禁用請求驗證。如果禁用操作方法的驗證,則對調用該方法的所有請求都禁用它,也就是說,所有用戶輸入均允許調用該操作方法的任何請求。因此,此方法是禁用請求驗證的最不安全的方法。

如果禁用對屬性的驗證,則允許用戶輸入對該屬性的任何引用。如果禁用特定字段的驗證,則可以控制哪個請求元素(字段)允許任意用戶輸入。

要禁用動作方法的請求驗證,請使用屬性ValidateInput(false)標記該方法,如以下示例所示:

C#
[HttpPost] [ValidateInput(false)] public ActionResult Edit(string comment) { if (ModelState.IsValid) { // Etc. } return View(comment); } 

要禁用對特定屬性的請求驗證,請使用AllowHtml屬性標記屬性定義:

C#
[AllowHtml] public string Prop1 { get; set; } 

若要對請求中的特定字段(例如,針對輸入元素或查詢字符串值)禁用請求驗證,請在獲取商品時調用Request.Unvalidated方法,如以下示例所示:

C#
var rawComment = Request.Unvalidated().Form["comment"]; 

在ASP.NET網頁中禁用請求驗證

若要禁用ASP.NET網頁的請求驗證,請在代碼中調用Request.Unvalidated方法,並將要繞過請求驗證的字段或其他對象的名稱傳遞給該方法。以下代碼段中的注釋指示哪些代碼行觸發請求驗證,哪些代碼行不觸發請求驗證。

 注意

在不包含Web窗體頁面或MVC控制器的ASP.NET Web Pages應用程序中,您不必更改Web.config文件中的任何設置。

C#
var userComment = Request.Form["userInput"]; // Validated, throws error if input includes markup Request.Unvalidated("userInput"); // Validation bypassed Request.Unvalidated().Form["userInput"]; // Validation bypassed Request.QueryString["userPreference"]; // Validated Request.Unvalidated().QueryString["userPreference"]; // Validation bypassed; 

手動檢查請求

如果禁用請求驗證,則必須手動檢查未驗證的用戶輸入是否存在潛在的危險輸入。檢查危險輸入對於應用程序的安全性至關重要。但是,這不一定是一件容易的事。如果您的代碼存在缺陷,或者您忘記保護一頁或一個字段,那么惡意用戶最終可能會發現並利用該缺陷。

通常,您應該盡可能地限制將接受的HTML標簽列表,並拒絕其他所有內容。(這種方法有時被稱為使用安全條款列表或白名單。)

如果使用的是Web Forms頁面,則通常可以使用第三方“富文本”控件,該控件使用戶可以設置文本格式。這些控件通常具有內置的驗證例程,該例程僅允許安全HTML。(如果使用控件,請確保它提供HTML安全性。)

如果不使用控件,則一種簡單的方法是對用戶輸入進行HTML編碼,然后僅對要允許的HTML標簽進行有選擇地取消編碼。如果要允許的標簽不包含屬性,例如<b>,<strong>,<i>和<em>,則此方法很實用。以下示例顯示了一種編碼方式,然后僅對<b>和<i>標簽進行選擇性解碼。

C#
// Encode the string input StringBuilder sb = new StringBuilder( HttpUtility.HtmlEncode(htmlInputTxt.Text)); // Selectively allow <b> and <i> sb.Replace("&lt;b&gt;", "<b>"); sb.Replace("&lt;/b&gt;", "</b>"); sb.Replace("&lt;i&gt;", "<i>"); sb.Replace("&lt;/i&gt;", "</i>"); 

為了在用戶輸入中允許更靈活的HTML標記,您可以使用第三方庫。示例包括可以從CodePlex網站上下載HTML Agility Pack和開放源代碼OWASP Anti-Samy實用程序有關更多信息,請參見OWASP網站上示例,該示例為ASP.NET禁用請求驗證。

另一種方法是使用標記的替代形式,例如MarkDown,然后將用戶的文本轉換為有效且安全的HTML。許多Wiki使用這種方法。有關Markdown的更多信息,請參見Daring Fireball網站。

網址:https://html-agility-pack.net/?z=codeplex

附加信息

 

 

上面內容復制子微軟官網,破壞掉了文章格式,請到原文查看。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM