每当用户在我的web应用程序中的页面中发布包含<或>的内容时,我都会引发此异常。

我不想因为有人在文本框中输入了字符而引发异常或使整个web应用程序崩溃,但我正在寻找一种优雅的方式来处理这一问题。

捕获异常并显示

出现错误,请返回并重新键入整个表单,但这次请不要使用<

我觉得不够专业。

禁用后验证(validateRequest=“false”)肯定可以避免此错误,但这会使页面容易受到许多攻击。

理想情况下:当发生包含HTML限制字符的回发时,表单集合中的回发值将自动进行HTML编码。因此,我的文本框的.Text属性将是&lt;html&gt;

有没有办法让我从处理者那里做到这一点?


当前回答

如果您确实需要特殊字符,如,>,<等,请禁用页面验证。然后确保在显示用户输入时,数据是HTML编码的。

页面验证存在安全漏洞,因此可以绕过它。此外,不应仅依赖页面验证。

参见:http://web.archive.org/web/20080913071637/http://www.procheckup.com:80/PDFs/bypassing-dot-NET-ValidateRequest.pdf

其他回答

在ASP.NET MVC中,您需要在web.config中设置requestValidationMode=“2.0”和validateRequest=“false”,并将ValidateInput属性应用于控制器操作:

<httpRuntime requestValidationMode="2.0"/>

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

and

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

对于MVC,通过添加

[ValidateInput(false)]

在控制器中的每个动作之上。

如果你只是想告诉你的用户不使用<和>,但是,你不希望在手写之前处理/返回整个表单(并丢失所有输入),你能简单地在字段周围放置一个验证器来筛选这些(以及其他潜在危险的)字符吗?

对于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中控制这一点更安全,因为您可以在站点级别看到哪些页面允许标记作为输入。

您仍然需要在禁用请求验证的页面上以编程方式验证输入。

只要这些字符只是“<”和“>”(而不是双引号本身),并且您在上下文中使用它们,例如<input value=“this”/>,您就安全了(而对于<textarea>这一个</textarea>,您当然会受到攻击)。这可能会简化您的情况,但要做更多的事情,请使用其他发布的解决方案之一。