asp.net - 从客户端检测到有潜在危险的Request.Form值

  显示原文与译文双语对照的内容

每当用户在我的web webapp中的页面中发布包含 <or> 的内容时,我就会得到这个异常。

我不想进入关于抛出一个异常或者崩溃整个web阅读器的讨论的讨论,因为有人在文本框中输入了一个字符,但是我正在寻找一种优雅的处理方式来处理这个问题。

捕获异常并显示 An error has occured please go back and re-type your entire form again, but this time please do not use < 对我来说似乎不够专业

禁用post验证( validateRequest="false" ) 肯定会避免这个错误,但这会让页面受到大量攻击。

理想情况下:当一个回发到含有HTML限制字符的帖子时,表单集合中的投递值将自动被HTML编码。 所以我的text-box .Text 属性将被 something & lt; html & gt;

我可以通过一个处理程序来做到这一点?

时间:

我想你是从错误的角度攻击了所有已经发布的数据。

注意," <"也可以来自其他外部源,比如数据库字段,配置,文件,提要等等。

此外," <"本身并不是危险的,它在特定上下文中是唯一危险的: 将未编码的字符串写入HTML输出( 因为 XSS ) 时。 在其它环境中的不相同子串都是危险的,比如 如果让你写一篇user-provided网址转换为链接,子字符串" javascript:"可能有危险。 在SQL查询中插入字符串时,另一个引号字符是危险的,但如果是从表单提交或者从数据库字段读取的名称的一部分,则非常安全。

底线是:你不能过滤危险字符的随机输入,因为在合适的情况下任何特征都可能是危险的。 你应该在某些特定字符可能会成为危险的地方编码,因为它们交叉到一个不同的子语言,它们有特殊意义。 当你将字符串写入HTML时,你应该使用 Server.HtmlEncode 编码具有特殊意义的字符。 如果将字符串传递给 dyamic SQL语句,则应该对不同的字符进行编码。

当你确信你HTML-encode所到之处传递字符串转换为 HTML,然后设置 validateRequest="false"

在. NET 4中,你可能需要做一点。 有时也需要添加 <httpRuntime requestValidationMode="2.0"/> 到 Web.Config ( 参考 ) 。

如果使用 ASP.NET MVC,则会有一个不同的解决方案:

Visual Basic示例:


<AcceptVerbs(HttpVerbs.Post), ValidateInput(False)> _
Function Edit(ByVal collection As FormCollection) As ActionResult
. . .
End Function

C# 示例:


[HttpPost, ValidateInput(false)]
public ActionResult Edit(FormCollection collection)
{
//...
}

在 ASP.NET MVC 3中,你可以将 AllowHtml 属性添加到模型的属性中。

它允许在模型绑定期间包含HTML标记,跳过对属性的请求验证。


[AllowHtml]
public string Description { get; set; }

如果你在. NET 4.0上,请确定你在 web.config 中添加了它


<httpRuntime requestValidationMode="2.0"/>

<system.web> 标签内

对于 ASP.NET 4.0,你可以通过将标记全部放入 <location> 元素来允许标记作为特定页面的输入。 这将确保所有其他页面都是安全的。 你不需要将 ValidateRequest="false" 放在aspx页中。


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

在你的Web.Config 中控制这一点比较安全,因为你可以在站点级别看到哪些页面允许标记作为输入。

在被验证为 html/js injections,目前上面的回答都很不错,但是没有人说如何排除单个技术领域研究 我不知道以前的版本,但在MVC3测试版中,你可以这样做:


[HttpPost, ValidateInput(true, Exclude ="YourFieldName")]
public virtual ActionResult Edit(int id, FormCollection collection)
{
. . .
}

这仍然验证除排除的字段之外的所有字段。 这,你的验证属性仍是请验证字段的妙处,你只是没有得到该"从客户端检测到一个潜在危险的Request.Form 值"异常。

我已经使用它验证正则表达式。 我自己的ValidationAttribute,看不是是有效的正规表达式 有了 上面代码正则表达式可以包含一个东西,看起来像一个脚本我应用将内容尽情 正规表达式 仍在检查它是否是有效还是无效,但是不能告诉你它包含脚本或者 html 。

在 ASP.NET MVC中,你需要在 Web.Config 中设置 requestvalidationmode=" 2.0"和 validaterequest="错误",并在控制器操作中应用一个ValidateInput属性:


<httpRuntime requestValidationMode="2.0"/>

<configuration>
 <system.web>
 <pages validateRequest="false"/>
 </system.web>
</configuration>


[Post, ValidateInput(false)]
public ActionResult Edit(string message) {
. . .
}

请记住,一些. NET 控件将自动对输出进行HTML编码。 例如在TextBox控件上设置. Text 属性将自动对它的进行编码,这意味着将 <转换为 &lt;,> 到 &gt; 和&到 &amp; 。 所以要小心这样做。。


myTextBox.Text = Server.HtmlEncode(myStringFromDatabase);//Pseudo code

但是,超链接,文字和标签的. Text 属性不会对这些属性进行编码,因此如果你想防止在这些属性上设置的任何内容,那么在这些属性上环绕 Server.HtmlEncode(); 是必须 <script> window.location ="http://www.porn.com"; </script> 将输出输出到页面并随后执行。

做一些实验来看看哪些是编码的,哪些是不对的。

...