我一直在复习discourse.js的源代码,discourse.js是一个用Ember/Rails/Postgres编写的讨论论坛。我正在研究在这类应用程序中避免XSS漏洞的最佳实践。
我注意到,话语使用了"熟"字符串的概念,这是用于帖子正文等内容的部分预转义字符串,然后使用三重胡子({{{}}}
)在Ember中显示它们。
然而,在其他情况下,如帖子标题,话语发送和接收原始的、未标注的字符串,如"关于标签的这个和那个",并使用双胡子显示它们({{}}
)。
关于这一切,我有以下问题:
(1) 话语似乎只在支持Markdown的领域使用"烹饪",比如后身体。烹饪仅仅是处理后处理Markdown字段的一种方式,还是也旨在解决XSS问题?
(2) 将原始字符串(包括看起来像HTML标记或实际上是HTML标记的东西)以JSON形式从服务器传递给客户端,这难道不被视为XSS漏洞吗?一些XSS嗅探器显然抱怨这样的事情,有些人似乎建议对服务器进行HTML实体转义和/或清理。
1)不太确定这里的话语在做什么。因为markdown被呈现为HTML,所以它需要使用未缩放的输出。否则,从markdown生成的HTML将被转义。话语似乎在源代码中有html净化,尽管我不确定它何时应用。
2) 我会说不。JSON不是一种可执行的格式。因此,只要文本被视为文本等,就没有问题。一般来说,不逃离服务器端的一个很好的理由是使用本机控件显示文本的移动应用程序。单页应用程序和移动应用程序可以使用相同的JSONAPI,但移动应用程序不需要转义。此外,转义还需要上下文。OWASP XSS预防作弊表定义了一组需要不同转义的上下文。因此,服务器上的单个转义可能是错误的。