输入过滤不能解决输出转义问题。抵挡不经意的攻击者充其量只是一种局部且不可靠的防御。在我看来,框架提供商将其作为针对 XSS 问题的可靠防御是错误的和不负责任的。
您必须对放入 HTML 字符串的任何文本内容进行 HTML 编码。同样,您必须对您放入 JS 字符串的任何文本内容进行 JavaScript-string-literal-encode。您必须对放入 SQL 查询的任何文本内容进行 SQL 转义。等等。
这完全取决于您创建的输出格式;它无法在您不知道输出目标格式将是什么的输入层处理。
如果您从 HTTP 参数输入以外的来源获取任何内容并将其包含在输出中,那么您根本不受保护;相反,如果您使用 HTTP 输入来创建 HTML 以外的内容,那么您的内容就会受到不必要的破坏。另外,当然,您正在阻止完全有效的输入——如果 SO 使用请求验证,我们将无法进行此对话,因为它会在我们提到的任何时候中断<script>
。
明智的编码人员使用现有的库/框架层来避免手动调用转义函数的需要,因为很容易忘记这样做。因此建议使用参数化查询,而不是从字符串连接创建 SQL。HTML 也是如此:使用精心设计的模板语言或 Web 控件集将避免您必须做任何事情,因为默认情况下会发生 HTML 转义。
ASP.NET 和 Web 窗体在这方面部分设计得很好。如果您设置TextBox.Text=...
为是,则内容将根据您的需要进行转义,无需执行更多操作。另一方面,如果您将Literal.Text=...
其设置为不编码,则默认情况下(这可以通过LiteralMode
属性进行更改)。这种不一致是非常不幸的。