1

我一直在查看 discourse.js 的源代码,这是一个用 Ember/Rails/Postgres 编写的讨论论坛。我正在研究避免此类应用程序中出现 XSS 漏洞的最佳实践。

我注意到 Discourse 使用了“cooked”字符串的概念,这些字符串是部分预转义的字符串,用于帖子正文等内容,然后使用三重胡须 ( {{{}}}) 在 Ember 中显示它们。

然而,在其他情况下,例如帖子标题,Discourse 发送和接收原始的、未转义的字符串,例如“关于标签的 This & that”,并使用双胡须 { {{}}) 显示它们。

我对这一切有以下疑问:

(1) 似乎 Discourse 只对支持 Markdown 的字段使用“cooking”,例如 post body。烹饪仅仅是一种处理后处理 Markdown 字段的方法,还是也旨在解决 XSS 问题?

(2) 将原始字符串(包括看起来像 HTML 标记或实际上是 HTML 标记的内容)以 JSON 格式从服务器传递到客户端是否不被视为 XSS 漏洞?一些 XSS 嗅探器显然抱怨这样的事情,有些人似乎建议在服务器上进行 HTML 实体转义和/或清理。

4

1 回答 1

1

1)不完全确定话语在这里做什么。因为markdown是渲染成HTML的,所以需要使用未转义的输出。否则,从 markdown 生成的 HTML 将被转义。Discourse 似乎确实在源代码中对 html 进行了清理,尽管我不确定何时应用它。

2)我会说不。JSON 不是可执行格式。因此,只要将文本视为文本等,就没有问题。一般来说,不转义服务器端的一个很好的理由是移动应用程序使用本机控件来显示文本。单页应用程序和移动应用程序可以使用相同的 JSON api,但移动应用程序不需要转义。另外转义需要上下文。OWASP XSS 预防备忘单定义了一组需要不同转义的上下文。所以服务器上的一次转义可能是错误的。

于 2014-04-21T07:02:43.400 回答