11

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

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

4 回答 4

40

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

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

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

于 2010-02-24T14:23:26.483 回答
15

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

于 2010-05-25T21:16:44.830 回答
3
  • 两个都
  • 仅当您打算更改它时,我个人不会这样做
  • AntiXss 类(因为它被称为AntiXss.GetSafeHtmlFragment()
于 2010-01-13T22:55:32.033 回答
-1

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

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

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

于 2010-01-13T23:06:37.877 回答