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

每次用戶在Web應用程序的頁面中發佈包含<>時,都會引起此異常。 html

我不想討論引起異常或崩潰整個Web應用程序的明智性,由於有人在文本框中輸入了字符,可是我正在尋找一種優雅的方式來解決這個問題。 web

捕獲異常並顯示 ajax

發生錯誤,請返回並從新輸入整個表格,可是此次請不要使用< 數據庫

在我看來還不夠專業。 編程

禁用後驗證( validateRequest="false" )確定會避免此錯誤,可是它將使頁面容易受到多種攻擊。 安全

理想狀況下:當發生包含HTML受限字符的回發時,Form集合中的已發賬值將自動進行HTML編碼。 所以,個人文本框的.Text屬性將是something & lt; html & gt; something & lt; html & gt; ide

有沒有辦法能夠從處理程序作到這一點? 網站


#1樓

在ASP.NET中,您能夠捕獲異常並對其進行處理,例如顯示友好的消息或重定向到另外一個頁面。此外,您還能夠本身處理驗證... 編碼

顯示友好的消息: spa

protected override void OnError(EventArgs e)
{
    base.OnError(e);
    var ex = Server.GetLastError().GetBaseException();
    if (ex is System.Web.HttpRequestValidationException)
    {
        Response.Clear();
        Response.Write("Invalid characters."); //  Response.Write(HttpUtility.HtmlEncode(ex.Message));
        Response.StatusCode = 200;
        Response.End();
    }
}

#2樓

我最終在每次回發以前都使用JavaScript來檢查不須要的字符,例如:

<asp:Button runat="server" ID="saveButton" Text="Save" CssClass="saveButton" OnClientClick="return checkFields()" />

function checkFields() {
    var tbs = new Array();
    tbs = document.getElementsByTagName("input");
    var isValid = true;
    for (i=0; i<tbs.length; i++) {
        if (tbs(i).type == 'text') {
            if (tbs(i).value.indexOf('<') != -1 || tbs(i).value.indexOf('>') != -1) {
                alert('<> symbols not allowed.');
                isValid = false;
            }
        }
    }
    return isValid;
}

固然,個人頁面主要是數據輸入,不多有元素能夠進行回發,可是至少保留了它們的數據。


#3樓

我也收到此錯誤。

在個人狀況下,用戶在「角色名稱」(關於ASP.NET成員資格提供程序)中輸入了重音符號á

我將角色名稱傳遞給一種方法,以向用戶授予該角色,而後$.ajax發佈請求失敗了……

我這樣作是爲了解決問題:

代替

data: { roleName: '@Model.RoleName', users: users }

作這個

data: { roleName: '@Html.Raw(@Model.RoleName)', users: users }

@Html.Raw作到了。

我獲得的角色名稱是HTML值roleName="Cadastro b&#225;s" 。 HTML實體的此值&#225; 被ASP.NET MVC阻止。 如今,我以應有的方式獲取roleName參數值: roleName="Cadastro Básico" ,ASP.NET MVC引擎將再也不阻止請求。


#4樓

對於ASP.NET 4.0,能夠將標記所有放入<location>元素中,從而容許標記做爲特定頁面而不是整個站點的輸入。 這將確保您全部其餘頁面都是安全的。 您無需在.aspx頁中放入ValidateRequest="false"

<configuration>
...
  <location path="MyFolder/.aspx">
    <system.web>
      <pages validateRequest="false" />
      <httpRuntime requestValidationMode="2.0" />
    </system.web>
  </location>
...
</configuration>

在web.config中進行控制比較安全,由於您能夠在站點級別看到哪些頁面容許標記做爲輸入。

您仍然須要以編程方式驗證禁用請求驗證的頁面上的輸入。


#5樓

沒有任何建議對我有用。 我不想關閉整個網站的此功能,由於99%的時間我不但願個人用戶將HTML放置在Web表單上。 我只是圍繞方法建立了本身的工做,由於我是惟一使用此特定應用程序的方法。 我在後面的代碼中將輸入轉換爲HTML,而後將其插入數據庫。

相關文章
相關標籤/搜索