每次用戶在Web應用程序的頁面中發佈包含<
或>
時,都會引起此異常。 html
我不想討論引起異常或崩潰整個Web應用程序的明智性,由於有人在文本框中輸入了字符,可是我正在尋找一種優雅的方式來解決這個問題。 web
捕獲異常並顯示 ajax
發生錯誤,請返回並從新輸入整個表格,可是此次請不要使用< 數據庫
在我看來還不夠專業。 編程
禁用後驗證( validateRequest="false"
)確定會避免此錯誤,可是它將使頁面容易受到多種攻擊。 安全
理想狀況下:當發生包含HTML受限字符的回發時,Form集合中的已發賬值將自動進行HTML編碼。 所以,個人文本框的.Text
屬性將是something & lt; html & gt;
something & lt; html & gt;
ide
有沒有辦法能夠從處理程序作到這一點? 網站
在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(); } }
我最終在每次回發以前都使用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; }
固然,個人頁面主要是數據輸入,不多有元素能夠進行回發,可是至少保留了它們的數據。
我也收到此錯誤。
在個人狀況下,用戶在「角色名稱」(關於ASP.NET成員資格提供程序)中輸入了重音符號á
。
我將角色名稱傳遞給一種方法,以向用戶授予該角色,而後$.ajax
發佈請求失敗了……
我這樣作是爲了解決問題:
代替
data: { roleName: '@Model.RoleName', users: users }
作這個
data: { roleName: '@Html.Raw(@Model.RoleName)', users: users }
@Html.Raw
作到了。
我獲得的角色名稱是HTML值roleName="Cadastro bás"
。 HTML實體的此值á
被ASP.NET MVC阻止。 如今,我以應有的方式獲取roleName
參數值: roleName="Cadastro Básico"
,ASP.NET MVC引擎將再也不阻止請求。
對於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中進行控制比較安全,由於您能夠在站點級別看到哪些頁面容許標記做爲輸入。
您仍然須要以編程方式驗證禁用請求驗證的頁面上的輸入。
沒有任何建議對我有用。 我不想關閉整個網站的此功能,由於99%的時間我不但願個人用戶將HTML放置在Web表單上。 我只是圍繞方法建立了本身的工做,由於我是惟一使用此特定應用程序的方法。 我在後面的代碼中將輸入轉換爲HTML,而後將其插入數據庫。