我一直在查看discourse.js的源代码,这是一个用Ember/Rails/Postgres编写的论坛,我正在研究避免这类应用程序中的XSS漏洞的最佳实践。
我注意到Discourse使用了“熟”字符串的概念,这些字符串是用于帖子正文等内容的部分预转义字符串,然后在Ember中使用三撇胡({{{}}}
)显示它们。
然而,在其他情况下,例如帖子标题,Discourse发送和接收原始的、未转义的字符串,例如“关于标签的This & that”,并使用双胡子({{}}
)显示它们。
关于这一切,我有以下问题:
(1)看起来Discourse只在支持Markdown的字段中使用“cooking”,比如post body。cooking仅仅是一种处理后处理Markdown字段的方法,还是也打算解决XSS问题?
(2)使用JSON格式的原始字符串(包括看起来像HTML标记或实际上是HTML标记的字符串)从服务器传递到客户端,难道不被认为是XSS漏洞吗?一些XSS嗅探者显然抱怨了这些问题,一些人似乎建议在服务器上对HTML实体进行转义和/或过滤。
1条答案
按热度按时间hrirmatl1#
1)不太清楚discourse在这里做了什么。因为markdown被呈现为HTML,它需要使用未转义的输出。否则从markdown生成的HTML将被转义。Discourse似乎在源代码中有html净化,尽管我不确定它是什么时候应用的。
2)我会说不。JSON不是一个可执行格式。所以只要文本被视为文本等,那么就没有问题。作为一个一般的想法,一个不逃离服务器端的好理由,将是一个移动的应用程序,它使用本机控件来显示文本。一个单页应用程序和一个移动应用程序可以使用相同的JSON API,但是移动的应用程序不需要转义。另外,转义需要上下文。OWASP XSS预防备忘单定义了一组需要不同转义的上下文。因此,服务器上的单个转义可能是错误的。