从客户端检测到潜在的危险Request.Form值
每次用户在Web应用程序的页面中发布包含<
或>
时,都会引发此异常。
我不想讨论引发异常或崩溃整个Web应用程序的明智性,因为有人在文本框中输入了字符,但是我正在寻找一种优雅的方式来解决这个问题。
捕获异常并显示
发生错误,请返回并重新输入整个表格,但是这次请不要使用<
在我看来还不够专业。
禁用后验证( validateRequest="false"
)肯定会避免此错误,但是它将使页面容易受到多种攻击。
理想情况下:当发生包含HTML受限字符的回发时,Form集合中的已发帐值将自动进行HTML编码。 因此,我的文本框的.Text
属性将是something & lt; html & gt;
something & lt; html & gt;
有没有办法可以从处理程序做到这一点?
#1楼
在ASP.NET中,您可以捕获异常并对其进行处理,例如显示友好的消息或重定向到另一个页面。此外,您还可以自己处理验证...
显示友好的消息:
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ás"
。 HTML实体的此值á
被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,然后将其插入数据库。