内容安全策略 (CSP) - unsafe-eval 的安全使用?

Content Security Policy (CSP) - safe usage of unsafe-eval?

我们使用以下 CSP header:

default-src 'self' *.ourdomain.com; script-src 'self' *.ourdomain.com 'sha256-[...]' 'unsafe-eval'; 
connect-src 'self' *.ourdomain.com; 
style-src 'unsafe-inline' * 'self' data:; font-src *; 
img-src * 'self' data:

我们安全团队的建议是不使用 unsafe-eval。

我的问题是:只要我们使用 sha256-[...] 来限制我们没有自己部署的任何脚本,安全风险是什么还在 CSP header 中保留 unsafe-eval?在什么情况下这仍然会使我们面临 cross-site 攻击?

因为 eval 实际上是不安全的。 Eval 在每种语言中的意思是“获取这个字符串并执行它的代码”。当然,您可能以半安全的方式使用 eval,但只要您完全允许,您就是在说“任何人都可以在我的应用程序中执行任意代码给定入口点”。

我的意见没有理由使用 eval。向我展示在实际有用的代码中 需要 eval 的情况,我敢打赌我可以在不使用 eval 的情况下重写代码或将其声明为不可能安全的代码。

禁止内联脚本只是成功的一半,特别是如果您使用 jquery。

测验:此代码会触发内联脚本违规还是 eval 违规?

$('body').html('<script>alert(1)</script>')

你可能会感到惊讶。

剧透:

它是 eval(在撰写本文时)

安全风险在于它不保护您自己的任何可能易受攻击的代码,因为使用了 eval

如果您在自己的代码中使用 eval,您应该质疑为什么。有没有更安全的替代方案可以代替?

See here 有关攻击者如何注入代码的(人为的)示例。当然,这是否可以对您的网站完成很大程度上取决于您的代码。

结果是几乎总有一种替代方法可以使用 eval