每当用户在我的 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; }