ASP.NET防御XSS跨站攻擊


目前做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.72.92.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,否則設置也是無效的。

本文轉載於:http://shiyousan.com/post/635563669112062894


免責聲明!

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



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