在存储到数据库之前或渲染之前清理 HTML? (ASP.NET 中的反 XSS 库)

Posted

技术标签:

【中文标题】在存储到数据库之前或渲染之前清理 HTML? (ASP.NET 中的反 XSS 库)【英文标题】:Sanitize HTML before storing in the DB or before rendering? (AntiXSS library in ASP.NET) 【发布时间】:2011-01-04 21:05:15 【问题描述】:

我有一个编辑器,它允许用户添加存储在数据库中并呈现在网页上的 html。由于这是不受信任的输入,我计划使用Microsoft.Security.Application.AntiXsSS.GetSafeHtmlFragment 来清理 HTML。

我应该在保存到数据库之前还是在将不受信任的输入呈现到网页之前进行清理? 在我的项目中包含 AntiXSS 源代码而不是仅包含 DLL 是否有优势? (也许我可以自定义白名单?) 我应该在哪个类文件中查找 GetSafeHtmlFragment 的实际实现

【问题讨论】:

【参考方案1】:

我不同意所选答案有两个原因

    如果您存储了编码数据,则必须在存储之前选择一个编码器。如果您将某些内容存储为 HTML,但又想以另一种格式将其推出,例如作为 JSON 响应或作为 XML 文档的一部分,会发生什么?您现在有一个必须解码的 HTML 编码格式,然后以正确的格式编码。 如果我们发现编码器中的错误并推出新版本怎么办?现在,因为您没有在输出点进行编码,所以您的所有旧数据都可能包含被错误编码的内容。您可以再次编码,但会遇到双重编码问题,正确过滤可能会很痛苦。

通常,您在输出点进行编码,并将来自数据存储的任何数据默认视为不受信任 - 毕竟,如果有人设法直接或通过 SQL 注入编辑您的数据库怎么办?

【讨论】:

我回来投票支持你,因为我同意你的论点,并且你的建议与 OWASP 的建议相匹配。希望@user102533 会转换并接受你的。 他存储的不是编码数据,而是经过清理的数据——差别很大(它仍然是未编码的 HTML) 当时第 2 点仍然有效(是的,我在阅读时没有足够注意!)如果消毒剂中有错误怎么办?或者您想更改清理规则? Microsoft.Security.Application.AntiXsSS.GetSafeHtmlFragment - 在清理过程中,它还会对其进行编码。这实际上是促使我寻找解决方案的原因。我不想将编码的东西存储在数据库中,而只是存储经过消毒的部分。 Womp womp...现在我不知道该存储什么...【参考方案2】:

收听OWASP podcast 67 with Jeff Williams on XSS。他谈到了在存储之前不进行消毒或编码。主要原因是,如果(何时)库为响应新漏洞而发展,您的数据将被困在旧版本中。当然,这不会阻止您在入口点针对白名单运行任何输入并拒绝任何超出可接受范围的内容。

【讨论】:

【参考方案3】: 两者 仅当您打算更改它时,我个人不会这样做 AntiXss 类(因为它被称为AntiXss.GetSafeHtmlFragment()

【讨论】:

数据库中已经有 HTML 代码,如果我在将其添加到数据库之前对其进行清理,那么我需要对已经存在的数据进行清理(以保持一致性)。但是在将其添加到数据库之前进行清理有什么价值吗? 对我来说,主要价值在于可能是某个新手制作了下一个从您的数据库中读取的网络应用程序。在你搬到更绿色的牧场后,你永远不知道谁会接手。此外,养成这样做的习惯也很好,因此这是第二天性。 +1 用于每次消毒,以防万一。唯一需要注意的是可能会影响性能,在这种情况下,您可以仅在保存到数据库时进行清理,但您需要注意数据库中的所有信息都经过真正的清理。【参考方案4】:

您可以在页面指令中使用参数ValidateRequest="true"。通过这种方式,所有请求数据都得到验证,如果存在验证问题,您始终可以发现错误。它还可以防止 sql 注入线程和其他不仅可能的 XSS。

对于数字数据,您可以使用 Int32.TryParse() 或任何其他 TryParse 系列(Byte.TryParse Int16.TryParse...)验证整数溢出或滥用数据类型

无需使用任何其他类或额外的消毒方法。

【讨论】:

请求验证默认是开启的,但是你对它有点太相信了。您需要将其视为一层安全性,并在输入点通过白名单验证进行补充(您有点接触到 int 解析)和输出编码。就 SQL 注入而言,它也不会为您做太多事情;语句“' or 1=1”将直接通过。这可能有助于为您更好地解释它:troyhunt.com/2010/05/…

以上是关于在存储到数据库之前或渲染之前清理 HTML? (ASP.NET 中的反 XSS 库)的主要内容,如果未能解决你的问题,请参考以下文章

在调度过程之后和渲染之前在反应生命周期中调用哪个方法

在提交到数据库之前使用 django 清理数据弹出删除数据

我应该清理降价吗?

在 .NET 中执行测试之前清理数据库

何时过滤/清理数据:在数据库插入之前还是在显示之前?

如何在将字段渲染到 Extjs 中的网格之前修改字段