我一直在查看 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 实体转义和/或清理。