每次用户在我的 Web 应用程序中发布包含<或>在页面中的内容时,我都会抛出此异常。
<
>
我不想讨论因为有人在文本框中输入了一个字符而引发异常或使整个 Web 应用程序崩溃的聪明之处,但我正在寻找一种优雅的方式来处理这个问题。
捕获异常并显示
发生错误,请返回并重新输入整个表单,但这次请不要使用 <
对我来说似乎不够专业。
禁用后验证 ( validateRequest="false") 肯定会避免此错误,但它会使页面容易受到许多攻击。
validateRequest="false"
理想情况下:当回发包含 HTML 受限字符时,表单集合中的发布值将自动进行 HTML 编码。所以.Text我的文本框的属性将是something & lt; html & gt;
.Text
something & lt; html & gt;
有没有办法从处理程序中做到这一点?
我认为您通过尝试对所有发布的数据进行编码来从错误的角度对其进行攻击。
请注意,“ <”也可能来自其他外部来源,如数据库字段、配置、文件、提要等。
此外,“ <”本身并不危险。它仅在特定上下文中是危险的:当编写尚未编码为 HTML 输出的字符串时(因为 XSS)。
在其他情况下,不同的子字符串是危险的,例如,如果您将用户提供的 URL 写入链接,则子字符串“ javascript:”可能是危险的。另一方面,单引号字符在 SQL 查询中插入字符串时很危险,但如果它是从表单提交的名称的一部分或从数据库字段读取的名称的一部分,则非常安全。
javascript:
底线是:您不能过滤随机输入的危险字符,因为任何字符在适当的情况下都可能是危险的。您应该在某些特定字符可能变得危险的地方进行编码,因为它们会进入具有特殊含义的不同子语言。将字符串写入 HTML 时,应使用 Server.HtmlEncode 对 HTML 中具有特殊含义的字符进行编码。如果您将字符串传递给动态 SQL 语句,您应该对不同的字符进行编码(或者更好的是,让框架通过使用准备好的语句等来为您完成)..
当您确定您在将字符串传递给 HTML 的任何地方都进行了 HTML 编码时,然后在文件ValidateRequest="false"中的<%@ Page ... %>指令中进行设置.aspx。
ValidateRequest="false"
<%@ Page ... %>
.aspx
在 .NET 4 中,您可能需要做更多的事情。有时还需要添加<httpRuntime requestValidationMode="2.0" />到 web.config(参考)。
<httpRuntime requestValidationMode="2.0" />