2010-01-13 27 views
7

我有一个编辑器,可让用户添加存储在数据库中并呈现在网页上的HTML。由于这是不可信的输入,我打算使用Microsoft.Security.Application.AntiXsSS.GetSafeHtmlFragment来清理HTML。在存储到数据库之前或渲染之前对HTML进行消毒处理? (ASP.NET中的AntiXSS库)

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

回答

28

我所选择的答案不同意,原因有二

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

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

+1

我回来并投票支持你因为我同意你的论点,你的建议与OWASP的建议相符。希望@ user102533会切换并接受你的。 – David 2010-02-26 17:51:05

+1

他没有存储编码数据,他存储的是消毒数据 - 差别很大(它仍然是未编码的HTML) – orip 2010-05-05 12:59:08

+0

点2仍然存在(是的,我在阅读中没有给予足够的关注!)如果在消毒剂中存在错误怎么办?或者你想改变sanitzation规则? – blowdart 2010-05-05 16:28:41

3
  • 两个
  • 只有当你打算改变它,我不会不亲自
  • 的AntiXss类(因为它被称为AntiXss.GetSafeHtmlFragment()
+0

数据库中已经有HTML代码,如果我在将它添加到数据库之前进行清理,那么我需要清理已存在的数据(为了一致性)。但是在将其添加到数据库中之前是否有任何消毒价值? – Nick 2010-01-14 03:24:01

+0

对我来说,主要的价值在于它可能是一个新手,他会让下一个Web应用程序从您的数据库中读取数据。你永远不知道在你开始转向绿色牧场之后谁会接管。另外,养成这样做的习惯是很好的,所以它是第二性质的。 – David 2010-01-14 03:37:54

+0

+1每次消毒,以防万一。唯一需要注意的是性能可能受到影响,在这种情况下,您可以在保存到数据库时进行清理,但您需要小心数据库中的所有信息都已经过清理。 – orip 2010-05-05 13:01:38

-1

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

数值数据,你可以验证整数溢出或Int32.TryParse()或任何其他的TryParse家庭(Byte.TryParse Int16.TryParse ...)的数据类型的滥用

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

+0

默认情况下,请求验证处于启用状态,但您对此有太多的信任。您需要将它作为一层安全性,并在输入点(您对此进行了解释)和输出编码时进行白名单验证。对于SQL注入来说,它也不会有太大的帮助。 “'或1 = 1”的陈述将直接通过。这可能有助于你更好地解释它:http://www.troyhunt.com/2010/05/owasp-top-10-for-net-developers-part-2.html – 2010-05-25 21:24:32

8

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

相关问题