移动端 CSP 策略中 default-src 与 script-src 的优先级如何判定?
当 script-src 指令未明确列出时,浏览器会回退使用 default-src 指令中的策略。
理解 fetch 指令的继承机制
Content Security Policy (CSP) 通过一系列指令控制资源加载,其中 fetch 指令用于指定特定类型的资源来源。每个资源类型都有对应的 fetch 指令,例如 script-src 用于控制 JavaScript 资源,img-src 用于控制图片资源。如果这些指令未在响应头中明确设置,浏览器将使用 default-src 指令作为默认策略。这意味着 default-src 充当后备机制,确保即使缺少特定指令,资源加载仍遵循统一的安全规则。
例如,如果响应头中仅设置了 default-src 'self',而未设置 script-src,浏览器将默认允许加载同源 JavaScript 资源。这种继承机制简化了策略配置,但要求开发者明确知晓哪些资源类型可能依赖默认策略,以避免意外开放不安全的资源来源。
script-src 指令的优先级高于 default-src
当响应头中同时存在 script-src 和 default-src 指令时,script-src 具有更高的优先级。浏览器会优先检查 script-src 的具体配置,仅当 script-src 未列出或未匹配时,才会回退到 default-src。这种设计允许针对特定资源类型实施更精细的控制,同时保留全局默认策略的兜底作用。
例如,若响应头设置为 default-src 'self' 和 script-src 'none',浏览器将严格禁止加载所有 JavaScript 资源,即使 default-src 允许同源加载。这种场景常见于需要完全隔离脚本执行的移动端页面,以防止跨站脚本攻击。
验证优先级规则的检查步骤
在移动端浏览器中验证优先级规则时,可通过开发者工具的 Network 面板查看响应头,确认 script-src 和 default-src 的具体配置。若 script-src 设置为 'none',而 default-src 为 'self',尝试加载一个同源 JavaScript 文件,观察是否被拦截。若加载失败,说明 script-src 优先级生效;若加载成功,则可能存在配置错误或浏览器兼容性问题。
此外,可在 Console 控制台查看 CSP 相关报错信息,例如“Refused to load script... because its directive's 'script-src' doesn't allow 'inline'”。此类错误通常指向 script-src 指令的具体限制,帮助开发者快速定位优先级应用场景。
避免过度依赖默认策略的安全建议
尽管 default-src 提供了便捷的后备机制,但过度依赖它可能导致安全漏洞。开发者应明确为所有关键资源类型(如 script-src、img-src)设置具体指令,而非仅依赖默认策略。例如,对于移动端应用,建议显式配置 script-src 'nonce-xxx' 以限制内联脚本执行,同时确保 default-src 不会意外开放不安全的资源来源。
此外,静态页面或单页应用(SPA)可能因缺少服务器端动态生成 nonce 的能力而难以使用 nonce 方案。此时,可结合 hash 方案保护内联脚本,或通过移除内联代码改用外部脚本文件,以降低安全风险。
资料与延伸阅读
你可以通过以下原始资料核对文中概念,并继续深入阅读。