【发布时间】:2021-07-17 19:51:34
【问题描述】:
我想验证我在使用 Vue I18n 时对 v-html 和 XSS 问题的理解。
我们有几类内容:
-
用户提供 - 用户向输入添加文本,数据将按原样显示在页面上
-
提供的翻译器 - 使用 CMS 的翻译器正在向翻译文件添加内容,然后我们会显示这些值
-
工程师提供 - 工程师正在将 html 添加到翻译文件中
#1 完全不可信
#2 可能是值得信赖的,但需要审查(我们将生成翻译文件,这些文件将被添加到 PR 以进行正常的代码审查和 QA 流程)
#3 是否值得信赖?工程师在模板中添加 html 与翻译文件之间有区别吗?或者仅仅是 html 可能在翻译文件中的事实让我们容易受到某种利用?
Vue I18n documentation 上有一段说,
...如果您在语言环境消息中配置标签,则有一个 由于本地化而导致 XSS 漏洞的可能性 v-html="$t('term')".
在客户端翻译文件中使用“可信内容”时是否存在固有的 XSS 风险?
编辑:考虑到这一点之后,它变得非常冒险。如果我们允许 v-html 出现在翻译部分,因为我们知道说超链接是可以的,但我们也会显示像 company_name 这样的其他内容,其中可能存在错误内容。
我做了一些检查,看起来 Rails 处理这个问题的方式不同。即使翻译被标记为_html,提供的values仍然被转义,只是内容本身被允许有html。
示例:
name = "<b>Name</b>"
导轨 -> foo_html: "hi {name} <u>underlined text</u>"
结果是带下划线的文本,但名称不是粗体,并且显示的内容周围仍然有<b>(它忽略了提供的参数中的html)
Vue I18n -> 带有 v-html -> foo: "hi {name} <u>underlined text</u>"
文字加下划线,名字加粗,不安全
【问题讨论】: