每当用户在我的web应用程序中的页面中发布包含<或>的内容时,我都会引发此异常。
我不想因为有人在文本框中输入了字符而引发异常或使整个web应用程序崩溃,但我正在寻找一种优雅的方式来处理这一问题。
捕获异常并显示
出现错误,请返回并重新键入整个表单,但这次请不要使用<
我觉得不够专业。
禁用后验证(validateRequest=“false”)肯定可以避免此错误,但这会使页面容易受到许多攻击。
理想情况下:当发生包含HTML限制字符的回发时,表单集合中的回发值将自动进行HTML编码。因此,我的文本框的.Text属性将是<;html>;
有没有办法让我从处理者那里做到这一点?
原因
默认情况下,ASP.NET验证所有输入控件中可能导致跨站点脚本(XSS)和SQL注入的潜在不安全内容。因此,它通过抛出上述异常来禁止此类内容。默认情况下,建议允许在每次回发时进行此检查。
解决方案
在许多情况下,您需要通过富文本框或富文本编辑器将HTML内容提交到页面。在这种情况下,可以通过将@Page指令中的ValidateRequest标记设置为false来避免此异常。
<%@ Page Language="C#" AutoEventWireup="true" ValidateRequest = "false" %>
这将禁用已将ValidateRequest标志设置为false的页面的请求验证。如果要禁用此功能,请检查整个web应用程序;您需要在web.config<system.web>部分中将其设置为false
<pages validateRequest ="false" />
对于.NET 4.0或更高版本的框架,您还需要在<system.web>部分添加以下行以使上述工作正常。
<httpRuntime requestValidationMode = "2.0" />
就是这样。我希望这能帮助你解决上述问题。
引用者:ASP.Net错误:从客户端检测到潜在危险的Request.Form值
如何在ASP.NET 4.6.2中修复AjaxExtControls的此问题:
我们在AjaxExtControls富文本编辑器中遇到了同样的问题。此问题在从.NET 2.0升级到.NET 4.5后立即开始。我查看了SOF的所有答案,但没有找到一个不损害.NET4.5提供的安全性的解决方案。
修复1(不推荐,因为它会降低应用程序的安全性):我在requestValidationMode=“2.0,它起了作用,但我担心安全特性。因此,这是一个修复,就像降低了整个应用程序的安全性。
修复2(推荐):由于这个问题只发生在AjaxExtControl中的一个,我最终能够使用下面的简单代码解决这个问题:
editorID.value = editorID.value.replace(/>/g, ">");
editorID.value = editorID.value.replace(/</g, "<");
在向服务器发送请求之前,在客户端(javascript)上执行此代码。注意,editorID不是我们在html.aspx页面上的ID,而是AjaxExtControl内部使用的富文本编辑器的ID。
前面的答案很好,但没有人说过如何排除一个字段进行HTML/JavaScript注入的验证。我不知道以前的版本,但在MVC3 Beta版中,您可以这样做:
[HttpPost, ValidateInput(true, Exclude = "YourFieldName")]
public virtual ActionResult Edit(int id, FormCollection collection)
{
...
}
这仍然会验证除排除的字段之外的所有字段。这一点的好处是,您的验证属性仍然验证字段,但您没有得到“潜在危险的请求。表单值已从客户端检测到”异常。
我已经用它验证了正则表达式。我制作了自己的ValidationAttribute,以查看正则表达式是否有效。由于正则表达式可以包含类似于脚本的内容,我应用了上面的代码-正则表达式仍然在检查是否有效,但不检查是否包含脚本或HTML。