ecmascript-6 - 使用带有不受信任字符串的模板文字设置属性值时,是否存在 XSS 风险?

标签 ecmascript-6 xss template-literals

我正在构建一个 iframe,而不是 innerHTML , 但带有 createElement .. 我使用了两个不受信任的字符串:

iframeEl.title = untrustedStr1;
iframeEl.src = `http://example.com/?id=${untrustedStr2}`;

根据 OWASP XSS 备忘单,title属性是 totally safe ,所以我对此并不担心。

但是,我不是 100% 确定 iframeEl.src案例。

我在考虑 5 significant characters通常需要编码:< , > , & , " , 和 '而且我看不出有任何方法可以逃脱模板文字。而且我也没有看到有 untrustedStr2 的机制作为 JavaScript 运行。 (例如,如果 untrustedStr2 = 'document.cookie' ,它被插入为一个字符串,而不是通过评估)。

我想如果untrustedStr2不知何故是一种 setter/getter 方法,我可能会遇到问题。但如果它绝对是一个字符串,这是安全的,我不需要编码,即使是 5 个重要字符。是吗?

最佳答案

在使用 DOM 时,任何 元素属性中都没有html 编码 问题。字符< , > , & , " , 和 '不需要转义。

但是,您仍然需要处理各个属性的语义。同时 title只是一个普通字符串,除了显示工具提示外不用于任何其他用途,其他的都不安全:

  • on…事件处理程序包含 javascript 代码。无论如何,为它们分配字符串是一种不好的做法,但如果这样做,插值必须遵循 javascript 转义规则。
    Rule #3
  • style属性包含需要自己转义的 CSS 规则。
    Rule #4
  • srchref属性是浏览器将在某个时候加载的 url。这些肯定是敏感的,在将值插入 url 时,您需要遵循 URL 编码规则。
    Rule #5
  • ……(并非详尽无遗)

在您的特定情况下,如果您无法对 untrustedStr2 进行 url 编码,攻击者可能会发送任意查询参数或片段到example.com .如果 example.com 不易受到反射 XSS 的影响(攻击者可能会通过其他 channel 向用户发送相同的链接),这本身不是安全问题,但它的功能已损坏(不良行为),但它仍然是您的页面认可链接的内容。

所以如果untrustedStr2表示 id 的值URI 查询参数,你绝对应该使用

iframeEl.src = `http://example.com/?id=${encodeURIComponent(untrustedStr2)}`;
//                                       ^^^^^^^^^^^^^^^^^^

关于ecmascript-6 - 使用带有不受信任字符串的模板文字设置属性值时,是否存在 XSS 风险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64959723/

相关文章:

javascript - 为什么我不能在 ES6 中导出名为 "import"的函数

javascript - 传播运算符将对象转换为数组

javascript - 在没有脚本标签的情况下为 XSS 执行 JavaScript

javascript - 表情符号模板文字中的 Unicode 值

javascript - 在模板文字中设置 HTML Button`onclick`

javascript - 从函数内的 if 语句调用函数

javascript - 查询 JavaScript 父子对象

php - 为防止 XSS 和 SQL 注入(inject)而限制的字符列表?

php - 有效的电子邮件地址 - XSS 和 SQL 注入(inject)

javascript - 为什么变量在 for 循环内没有更新? JS