协慌网

登录 贡献 社区

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

每当用户在我的 Web 应用程序中发布包含<>时,我都会抛出此异常。

我不想进入关于抛出异常或崩溃整个 Web 应用程序的聪明性的讨论,因为有人在文本框中输入了一个字符,但我正在寻找一种优雅的方法来处理这个问题。

捕获异常并显示

发生错误请返回并重新输入整个表单,但这次请不要使用 <

对我来说似乎不够专业。

禁用后验证( validateRequest="false" )肯定会避免此错误,但会使页面容易受到多次攻击。

理想情况:当发回包含 HTML 限制字符的回发时,Form 集合中的已发布值将自动进行 HTML 编码。所以我的文本框的.Text属性将是something & lt; html & gt;

有没有办法可以从处理程序中执行此操作?

答案

我认为你是通过尝试编码所有发布的数据从错误的角度攻击它。

请注意,“ < ” 也可能来自其他外部源,如数据库字段,配置,文件,订阅源等。

此外,“ < ” 本身并不危险。它在特定的上下文中是危险的:当编写未编码为 HTML 输出的字符串时(因为 XSS)。

在其他情况下,不同的子字符串是危险的,例如,如果您将用户提供的 URL 写入链接,则子字符串 “ javascript: ” 可能是危险的。另一方面,单引号字符在 SQL 查询中插入字符串时很危险,但如果它是从表单提交的名称的一部分或从数据库字段读取,则非常安全。

底线是:您无法过滤危险字符的随机输入,因为在适当的情况下任何字符都可能是危险的。您应该在某些特定字符可能变得危险的位置进行编码,因为它们会跨越到具有特殊含义的不同子语言。将字符串写入 HTML 时,应使用 Server.HtmlEncode 对 HTML 中具有特殊含义的字符进行编码。如果将字符串传递给动态 SQL 语句,则应编码不同的字符(或者更好,让框架通过使用预处理语句等为您完成)。

如果您确定在任何地方进行 HTML 编码,则将字符串传递给 HTML,然后在.aspx文件的<%@ Page ... %>指令中设置validateRequest="false"

在. NET 4 中,您可能需要做更多的事情。有时还需要将<httpRuntime requestValidationMode="2.0" />到 web.config( 引用 )。

如果您使用的是 ASP.NET MVC,则会出现此错误的不同解决方案:

C#样本:

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

Visual Basic 示例:

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

在 ASP.NET MVC(从版本 3 开始)中,您可以将AllowHtml属性添加到模型的属性中。

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

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