vue.js - 我什么时候可以信任我在 Vue 中的翻译内容?
问题描述
我想验证我v-html
在使用 Vue I18n 时对 XSS 问题的理解。
我们有几类内容:
用户提供 - 用户向输入添加文本,数据将按原样显示在页面上
提供的翻译器 - 使用 CMS 的翻译器正在向翻译文件添加内容,然后我们会显示这些值
提供工程师 - 工程师正在将 html 添加到翻译文件中
#1 完全不可信
#2 可能是值得信赖的,但需要审查(我们将生成翻译文件,这些文件将被添加到 PR 以进行正常的代码审查和 QA 流程)
#3 是否值得信赖?工程师在模板中添加 html 与翻译文件之间有区别吗?或者仅仅是 html 可能在翻译文件中的事实让我们容易受到某种攻击?
Vue I18n 文档中有一节说,
...如果您在语言环境消息中配置标签,由于使用 v-html="$t('term')" 进行本地化,可能会出现 XSS 漏洞。
在客户端翻译文件中使用“可信内容”时是否存在固有的 XSS 风险?
编辑:考虑到这一点之后,它变得非常冒险。如果我们允许v-html
一段翻译,因为我们知道说超链接是可以的,但我们也会显示其他内容,比如company_name
那里可能有不好的内容。
我做了一些检查,看起来 Rails 以不同的方式处理这个问题。即使翻译被标记为_html
,提供的值仍然被转义,只是内容本身被允许有 html。
示例:与name = "<b>Name</b>"
Rails ->foo_html: "hi {name} <u>underlined text</u>"
产生带下划线的文本,但名称不是粗体并且显示的内容仍然<b>
围绕它(它忽略了提供的参数中的 html)
Vue I18n -> with v-html ->foo: "hi {name} <u>underlined text</u>"
文字加下划线,名字加粗,不安全
解决方案
你问了几个问题
只要对来自 #2 的内容进行了恶意内容审核,用作原始 html 是否安全?
是和不是。从理论上讲,如果您检查每条消息,并了解每条消息的上下文,并且永远没有时间限制,因此人们在每次发布之前都会检查每条消息,那么您就可以了。在实践中,人们偷工减料,或者不知道特定消息将作为 html 插入,或者不了解某些字符串如何可能是格式错误的 html,但被浏览器转换为实际上是恶意的有效 html。有人可能会访问您的 CMS 并更改您没想到会更改的翻译字符串。如果没有通过欺骗员工访问 URL 来正确配置表单提交,那么有人可能会在您的 cms 中伪造表单提交。
或者仅仅是 html 可能在翻译文件中的事实让我们容易受到某种攻击?
v-html
就是这样。它将未经过滤的 html 放置在您的文档中。
这种可能性是什么,它是如何工作的?
v-html
使用翻译的字符串会产生不必要的风险和额外的开销,因为需要具有广泛技术知识的文案来检查每条翻译消息,而您可以让没有任何技术知识的文案来执行此操作。您唯一需要做的就是使用文档中概述的模式,它允许任何人更改可翻译位(将被转义),同时将 html 保留在源代码管理中。
推荐阅读
- python - 如何将标签添加到情节授予情节
- php - symfony 路由过滤器
- java - 如何在java中读取字符串xml字符串?
- java - 他们是我的要求的任何替代方法而不是迭代器
- excel - 从 Sheet1 复制使用的范围并粘贴到 Sheet3
- android - Actions 测试工具出现“抱歉,无法获取”错误
- linux - udev - 在一个符号链接下收集 USB 类
- python - 过滤日期时间列
- grails - 如何在一台 Windows 机器上运行不同版本的 grails 并让它们相互交互?
- java - 不能在 child() 中为参数“pathString”传递 null?这是我从 firebase 检索数据时遇到的错误