CSP:为什么document.createElement“ script”很好而document.write“ <script ...”不好?

问题描述

我有点困惑。我一直在经历presentation slide deck on Content Security Policies。在幻灯片10上,在讨论'strict-dynamic'指令时,给出了三个示例:一个好,两个坏:

// good
<script nonce="r4nd0m">
 var s = document.createElement("script");
 s.src = "//example.com/bar.js";
 document.body.appendChild(s);
</script> 

// bad
<script nonce="r4nd0m">
 var s = "<script src=//example.com/bar.js></script>";
 document.write(s);
 // -OR-
 document.body.innerHTML = s;
</script> 

Google还建议对其CSP page进行类似的更改(“重构对与CSP不兼容的JS API的调用”)。
我了解好的示例将异步加载,而不良的示例则不会(unless async defer is added)。但是...

如果我想加载一个邪恶的脚本,两种方法都不能让我到达那里吗?

问题是“坏”方式不会(自动)传播随机数吗?还是“ {bad}”有点“ like a call to eval()”,因为您可以用它做很多事情(尽管在HTML 5中,script wouldn't execute除非附加到事件处理程序,否则显然)?

是不是假设likely uses parser-inserted user input是“坏”方式,这就是为什么它很坏(这就是我从后来发现的演示视频中得到的结果)?

为什么不允许一个调用而不允许另一个调用(在给定的示例中,它们似乎实现了相同的事情-加载外部脚本)?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)