每次用户在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,而后将其插入数据库。