我正在构建一个 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 -
src
或href
属性是浏览器将在某个时候加载的 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/