我们使用以下CSP头:
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头中的unsafe-eval存在什么安全风险?在什么情况下这仍会使我们暴露于跨站点攻击?
eval()
在代码依赖于某些运行时数据的情况下可以提高代码的速度。举个更具体的例子,考虑一个网站,用户提供数据的 URL 和一个任意表达式用于操作这些数据。该表达式需要被执行数百万次。使用解释方式执行(例如将表达式 "a.b.c" 转换为数组 ['a','b','c'],并循环访问子对象)显然比 x=eval('(a) => a.b.c') 然后调用 x(a) 更慢。 - Yuri Astrakhaneval
。如果不重写别人的代码(这样使用这些库就没有意义了),我们只能束手无策,只好在定义中添加unsafe-eval
。 - IncredibleHat