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

时间:2010-01-13 22:53:07

标签: asp.net xss antixsslibrary html-sanitizing

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

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

4 个答案:

答案 0 :(得分:32)

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

  1. 如果您存储了编码数据,则必须在存储之前选择编码器。如果您将某些内容存储为HTML但又希望以其他格式将其推出(例如作为JSON响应或作为XML文档的一部分),会发生什么?您现在有一个必须解码的HTML编码格式,然后以正确的格式进行编码。
  2. 如果我们发现编码器中的错误并推出新版本怎么办?现在,因为您没有在输出点进行编码,所有旧数据可能包含错误编码的内容。你可以再次编码,但是你遇到了双重编码问题,这些问题可能会很难正确过滤。
  3. 通常,您在输出点进行编码,并将来自数据存储的任何数据视为默认情况下不受信任 - 毕竟,如果有人设法直接编辑数据库或通过SQL注入,该怎么办?

答案 1 :(得分:11)

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

答案 2 :(得分:3)

  • 两个
  • 只有你计划改变它,我不会亲自去做
  • AntiXss类(因为它被称为AntiXss.GetSafeHtmlFragment()

答案 3 :(得分:-1)

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

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

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