1. 程式人生 > >讓ASP.NET接受有“潛在危險”的提交

讓ASP.NET接受有“潛在危險”的提交

什麼是有“潛在危險”的提交?馬上動手寫個簡單的例子: 用Visual Studio建立一個空白的ASP.NET MVC程式,一切預設即可,新增一個空白的HomeController,增加一個Index Action及一個Index View,View也可以暫時留空白,執行這個程式,一切都沒毛病,好,現在在位址列上敲入: http://localhost:37538/%3Cscript%3E 出現: “從客戶端中檢測到有潛在危險的Request.Path值”,當然了,你還可以在位址列上嘗試點別的,比如一些特殊符號,也可能出現這種情況,注意一下,現在出現的異常為:HttpException。 現在我們嘗試別的情況,改一下Controller:
    public class HomeController : Controller {
        public ActionResult Index() {
            return View();
        }
        [HttpPost]
        
public ActionResult Index(string p1) { ViewBag.P1 = p1; return View(); } }

再改一下View:

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<
body> <div> <p>@ViewBag.P1</p> <form method="post"> <input type="text" name="p1" /> <input type="submit" /> </form> </div> </body> </html>

程式碼很簡單,我們嘗試給p1寫點值,然後回顯,輸入個什麼“123”或者“abc”是沒問題的,但如果嘗試輸入“<a>”或者“<script>”之類的,就會出現:


“從客戶端中檢測到有潛在危險的Request.Form值”,和之前的出錯提示有些類似,但也有顯著不同,注意看,現在的Exception變成了HttpRequestValidationException,而不是之前的HttpException了。

還有另一種可以導致這個錯誤出現的方法,現在改一下Controller為:
    public class HomeController : Controller {
        public ActionResult Index() {
            return View();
        }
        [HttpPost]
        public ActionResult Index(string p1) {
            string p2 = Request.QueryString["p2"];
            ViewBag.P1 = p1;
            ViewBag.P2 = p2;
            return View();
        }
    }

View也改一下:

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        <p>@ViewBag.P1</p>
        <p>@ViewBag.P2</p>
        <form method="post">
            <input type="text" name="p1" />
            <input type="submit" />
        </form>
    </div>
</body>
</html>
執行,位址列上敲入:http://localhost:37538/Home/Index?p2=%3Cscript%3E 嗯?竟然沒有報錯!接著直接點頁面上的“提交”按鈕,這次報錯了。出錯提示差不多,我不再截圖,大致出錯文字資訊為:“從客戶端中檢測到有潛在危險的 Request.QueryString 值”,Exception型別為HttpRequestValidationException。 另外,對於傳統的Web Form,(還記得aspx嗎?同學們),也是會出現這個異常的,你隨便建一個叫“WebForm1.aspx”的頁面,然後位址列上敲:http://localhost:37538/WebForm1.aspx?p1=%3Cscript%3E 看吧,錯誤是一樣的。 總結一下: 1,如果URL的路徑(不包括引數)中帶有“潛在危險”,那麼開啟頁面時候會直接報錯,Exception型別為HttpException 2,如果URL引數或者Post的表單資料中含有“潛在危險”,那Exception會發生在我們嘗試去獲得“潛在危險”的時候,Exception型別為HttpRequestValidationException 這是ASP.NET的預設行為,主要是為了防止XSS,也就是跨站指令碼攻擊,關於XSS的文章很多,如需進一步瞭解請自行Google。雖然這個報錯看起來是一種好意,但這個情我不太想領,因為這個Yellow Dead Page十分不友好,另外,如果我們確實用得到這樣的“潛在危險”資料呢?比如我們做一個論壇,允許使用者使用一些HTML標籤來格式化他們的輸入,這樣接受“潛在危險”就變成了必須了。我們現在來改變一下ASP.NET的預設行為,讓它不再丟擲這樣的異常。很簡單,我們來修一下web.config:
  <system.web>
    <httpRuntime requestPathInvalidCharacters="" requestValidationMode="2.0" />  <!--避免了URL路徑的檢查-->
    <pages validateRequest="false"></pages>  <!--避免了aspx頁面對URL引數及表單資料的檢查-->
  </system.web>

但我們如今一般都很少用Web Form了,大家都MVC了對吧?對於ASP.NET MVC,還需要加一個全域性過濾器,來避免其對URL引數及表單資料的檢查,在Application_Start()中加入:

GlobalFilters.Filters.Add(new ValidateInputAttribute(false));

ALL DONE!

沒有了“潛在危險”檢查,假如危險真的來臨了,那可怎麼辦?你是說XSS嗎?一般情況下,如果你不需要像論壇那樣讓允許使用者提交“富文字”的話,直接用HTML Encode來呈現資料就肯定不會有XSS問題啊,使用者嘗試提交一段JavaScript,你用HTML Encode了之後,提交啥,就直接在頁面上顯示啥,也沒啥好擔心的,使用到@Html.Raw的時候就要格外小心一些,差不多就OK了。但如果你真的需要允許客戶提交富文字的話,情況就變得有些複雜了,有以下解決方案來避免XSS:

1,自行檢查提交內容,如果發現<script>標籤之類的,拒絕提交; 2,使用HTML Parser,嘗試找到“潛在危險”並將它們移除; 3,不用HTML標籤,改用Markdown; 第一種方案很容易想得到,並且要做也不難,但要做得好就很難,你考慮一下以下的情況:
<a href="javascript: danger();">danger</a>
<p onclick="danger();">danger</p>
<div style="width: expression(danger());">danger</div>

看吧,防不勝防,還有各種不同的標籤哦,各種onXXX事件,一些更高明的巢狀手法,唉,想做好是很難的了,這種方法不推薦!

第二種方法可以考慮使用HtmlAgilityPack這個庫,用它來解釋客戶端提交上來的內容,一個個Tag去遍歷。我建議使用“白名單”機制,只允許有限的tag,比如<a>,<p>,<div>,<ul>,<ol>,<li>等,遇到不認識的一律移除,這些標籤裡,也只允許有限的屬性,遇到諸如“onXXX”這種不在白名單裡的屬性一律移除,這樣就差不多了,還剩下一個比較麻煩的就是<a>標籤的href屬性,這個得做點特殊處理,自己判斷一下這裡邊是否有潛在的危險,我的做法是:

    static readonly Regex _regexIsSafe = new Regex("^([a-z][a-z,0-9]*):");
    static bool IsLegalLink(string link) {
        link = link.Trim().ToLower();
        Match match = _regexIsSafe.Match(link);
        if (match.Success) {
            string schema = match.Groups[1].Value;
            if (!"http".Equals(schema) && !"https".Equals(schema)) {
                return false;
            }
        }
        return true;
    }
這樣應該差不多了。或者更絕的做法就是乾脆把<a>標籤從白名單裡移除。 這個移除潛在危險程式碼的過程有個專業術語叫“Sanitize”,直譯的話就是“消毒”,嗯,挺形象的。 第三種方法是最為徹底的和先進的方法,但由於我沒做過,所以暫時就不在這裡展開了,建議大家去找找Markdown的解決方案,祝你好運!

相關推薦

ASP.NET接受“潛在危險”的提交

什麼是有“潛在危險”的提交?馬上動手寫個簡單的例子: 用Visual Studio建立一個空白的ASP.NET MVC程式,一切預設即可,新增一個空白的HomeController,增加一個Index Action及一個Index View,View也可以暫時留空白,執行這個程式,一切都沒毛病,好,現在

通過擴展ASP.NET Web API支持JSONP

web api enc pan star close web應用 lba dia 不存在 同源策略(Same Origin Policy)的存在導致了“源”自A的腳本只能操作“同源”頁面的DOM,“跨源”操作來源於B的頁面將會被拒絕。同源策略以及跨域資源共享在大部分情況下針

使用靜態基類方案 ASP.NET Core 實現遵循 HATEOAS Restful Web API

以及 acc repo pri == single partially context 繼承 Hypermedia As The Engine Of Application State (HATEOAS) HATEOAS(Hypermedia as the engi

asp.net 在 mac 上飛

.NET 不跨平臺一直飽受爭議,雖然微軟前端時間放出些訊息,要支援.NET跨平臺的發展,但是微軟一直堅持著不主動、不拒絕、不負責的三不態度,仍然用一種軟體帝國的心態,折騰著一些毫無新意的東西。微軟想要重新獲得大眾的尊重和認可,必須丟棄一些傳統的觀念,積極聽取開發者的聲音,和開發者站在一起共同發展,而這似乎看起

ASP.NET vNext 在 Mac OS 中飛呀飛。。。

寫在前面 閱讀目錄: 我個人覺得 MSDN 應該是 .NET 程式設計師常去的社群,為什麼?當你還在糾結 ASP.NET Web Forms 和 ASP.NET MVC 時,你所不知道的是,人家已經在 Mac OS 中使用 ASP.NET vNext 了。 關於 Mac OS 中構建 ASP.NET

ASP.NET MVC中的form提交改為ajax提交

在ASP.NET MVC檢視中通過 @using (Html.BeginForm()) 產生的是form表單提交程式碼,可以用javascript程式碼截獲這個form提交,改為ajax提交,示例程式碼如下: $('#form1').submit(function

通過擴充套件ASP.NET Web API支援JSONP

同源策略(Same Origin Policy)的存在導致了“源”自A的指令碼只能操作“同源”頁面的DOM,“跨源”操作來源於B的頁面將會被拒絕。同源策略以及跨域資源共享在大部分情況下針對的是Ajax請求。同源策略主要限制了通過XMLHttpRequest實現的Ajax請求

ASP.NET製作的網頁適應手機螢幕

一般手機開啟asp.net製作的網頁字型會顯得特別小,需要手動放大,影響使用者體驗。有沒有什麼方式可以讓瀏覽器幫使用者完成這個操作呢?非常簡單~在<head>和</head>之間插入程式碼。<meta name="viewport" conten

ASP.NET MVC View向Controller提交資料

    我們知道使用MVC的一個很重的的用途就是把Controller和View之間進行解耦,通過控制器來呼叫不同的檢視,這就註定了Controller和View之間的傳值是一個很重的知識點,這篇博文

ASP.NET MVC AJAX表單提交例項

1.首先,新建一個controller。 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespa

ASP.NET MVC 的表單提交

       ASP.NET MVC 開發過程中,我們經常要提交表單資料到後臺進行處理。今天就把常見的開發過程中用到的一些資料(表單)提交的方式做一個總結,方便自己今後查閱,如果對大家有益,那就更好了,總結得不好請大家給我留言指正。        首先我們說說不使用ASP.

ASP.NET MVC/Core表單提交後臺模型二級屬性驗證問題

起因 這個是網友在官網論壇的提問:https://fineui.com/bbs/forum.php?mod=viewthread&tid=22237     重新問題 本著務實求真的態度,我們先來複現這個問題。首先頁面截圖是這樣的:   類 

三行指令碼 asp.net core 附加程序除錯不再頭痛

在將專案升級到 asp.net core 2.2 後,很少使用 IIS Express 執行專案了,基本都是控制檯執行或者寫個指令碼批量啟動要執行的介面(多個輸出專案),一直以為是我機器的 bug 關於 vs 的 asp.net core 程序除錯的這個問題困擾了我好一段時間未曾解決,得空整理記錄一下。 問題

asp.net提交危險字符處理方法之一

article click事件 .net 所有 nco esc web 百度 escape 在form表單提交前,可以在web頁面,submit按鈕的click事件中,使用js函數對,可能有危險字符的內容進行編碼。 有3個函數可用: encodeURI() 函數可把字符串作

解決asp.net中“從客戶端中檢測到潛在危險的Request.Form值”的錯誤

在使用ASP.NET MVC 5 的過程中,在使用富文字編輯器過程中,出現如標題中的錯誤提示。網上找了一些解決方法。大多就是以mvc3,mvc4為版本的解決方案。在mvc5的controller的action方法頭部新增就可以解決 [ValidateInput(false)] 另外推薦一

asp.net 從客戶端中檢測到潛在危險的Request.Form值

asp.net 從客戶端中檢測到有潛在危險的Request.Form值 今天開發的時候碰到了這個問題。以前也碰到過但是一直沒有總結一下,所以每次碰到都上網找一下資料。 今天把這個問題解決方法記錄下來。跟大家分享一下。 解決方法: <%@ Page ValidateReque

asp.net MVC3 從客戶端(&)中檢測到潛在危險的 Request.Path 值。

A連結(url:http://localhost:56482/Sys/questionEdit/15&firstEdit=yes)開啟,發生錯誤,提示“從客戶端(&)中檢測到有潛在危險的 Request.Path 值。” 解決辦法: 步驟1、在Global檔

ASP.NET】9.解決百度富文字編輯器UEditor往後臺傳資料寫入資料庫時,出現錯誤:檢測到潛在危險的Request

解決方法:把傳資料的方式換一下,在函式上面新增[ValidateInput(false)],如果是winform頁面,在aspx頁面裡新增ValidateRequest="false"%@ Page V

ASP.Net MVC從客戶端中檢測到潛在危險的 Request.Form 值

ASP.NET MVC4(Razor)從客戶端中檢測到有潛在危險的 Request.Form 值  “/”應用程式中的伺服器錯誤。 從客戶端(Content=" sdfdddd ...")中檢測到有潛在危險的 Request.Form 值。 說明: ASP.NET 在請求中

ASP.NET MVC & WebApi 中實現Cors來Ajax可以跨域訪問 (轉載)

詳細 簡介 part bsp bob 打印 不能 res user 什麽是Cors? CORS是一個W3C標準,全稱是"跨域資源共享"(Cross-origin resource sharing)。它允許瀏覽器向跨源服務器,發出XMLHttpRequest請求,從而克服了