我开始在使用内联脚本和其他犯罪的网站上探索内容安全策略。我为每个标头字段配置了CSP,如下所示:
content-security-policy: default-src *; frame-ancestors 'self'; style-src 'self' 'unsafe-inline' fonts.googleapis.com cdn.jsdelivr.net *.stripe.com; report-uri https://sentry.io/api/x/csp-report/?sentry_key=y
我现在的问题是浏览器抱怨以下消息:
拒绝执行内联脚本,因为它违反了以下内容安全策略指令:" default-src *"
我阅读了default-src <source>
的文档,其中指出<source>
可以是以下来源之一:
<host-source>
<scheme-source>
'self'
'unsafe-inline'
在我看来,星号只能用于主机来源。但是我还能做什么,因为似乎只允许一个<source>
? default-src * 'unsafe-inline'
不合规,对吧?
我的目标基本上是使用最小的CSP配置(可以通过 iframe 嵌入)。我知道继续执行特定规则是最好的做法。
答案 0 :(得分:4)
在我看来,星号只能用于主机来源。
是
但是我还能做些什么,因为似乎只允许一个
<source>
?
允许多个<source>
。
default-src * 'unsafe-inline'
不合规,对吧?
符合要求。
您可以使用https://cspvalidator.org/进行检查。或https://csp-evaluator.withgoogle.com/。
但您确实希望避免在任何CSP策略中指定'unsafe-inline'
。使用'unsafe-inline'
几乎违背了CSP的全部目的。
对于导致CSP错误的任何内联脚本,您要做的是:从文档中取出脚本并将它们移动到单独的文件中。这就是重点。
但是如果你真的必须指定'unsafe-inline'
,那么就处理问题中引用的特定错误而言,你应该只为'unsafe-inline'
指定script-src
- 因为错误信息说,“拒绝执行内联脚本。”
如果您为'unsafe-inline'
指定default-src
,则会导致浏览器无法对文档中的任何内联资源进行CSP检查 - 样式表等,也是,不只是脚本。
因此,如果唯一的问题是内联脚本,并且由于某种原因您无法通过将脚本移动到单独的文件或为其指定哈希或nonce来解决这个问题,那么您至少应该只指定{{ 1}} 'unsafe-inline'
。