csp不能直接限制读取localstorage,但可通过严格配置connect-src等指令切断数据外发通道。需显式白名单可信api域名、禁用通配符与不安全协议,配合frame-src、object-src、form-action限制绕过路径,并用nonce或哈希杜绝内联脚本注入,辅以report-to实现违规监控。

要阻止攻击者利用本地存储(如 localStorage、sessionStorage)配合网络请求将数据外发,CSP 本身**不能直接限制读取本地存储的行为**(因为那是 JavaScript 运行时能力),但可以**切断其外发通道**——即严格管控所有可能被用于数据 exfiltration 的网络请求出口。关键在于精准配置 connect-src 指令,并辅以其他策略消除常见绕过路径。
只允许可信域名的 connect-src
connect-src 是封锁外发的核心指令,它控制 fetch()、XMLHttpRequest、EventSource、WebSocket 等主动发起连接的能力。攻击者即使窃取了 localStorage 数据,也无法发送出去,除非目标域名在白名单中。
- 禁止通配符和不安全来源:避免使用
connect-src *或connect-src 'unsafe-eval'(后者无关但常误配) - 显式列出仅需的 API 域名:例如
connect-src 'self' https://api.yoursite.com https://metrics.your-cdn.com - 禁用非必要协议:不允许可疑的
http:、ws:(明文 WebSocket)或data:(无法用于 connect,但常被混淆)
阻断常见外泄绕过方式
攻击者可能尝试用非常规方式外发数据,需一并限制:
-
禁止 iframe 嵌入第三方统计/广告域:配置
frame-src 'none'或仅限可信域,防止通过postMessage+ 恶意 iframe 中转数据 -
禁用插件与对象加载:设
object-src 'none',阻止 Flash / Java Applet 等旧式外泄载体(现代应用应已不用,但留空即风险) -
限制表单提交目标:用
form-action 'self'防止用户输入或伪造表单提交到恶意地址(虽不直接读 localStorage,但属同类数据出口)
配合 nonce 或哈希杜绝内联脚本注入
若页面存在内联脚本(如 <script>...localStorage.getItem(...)...</script>),攻击者可篡改或注入类似逻辑。必须避免放行 'unsafe-inline':
- 对必需的内联脚本,使用一次性
nonce:服务端生成随机值,写入响应头script-src 'self' 'nonce-{abc123}',并在 script 标签加nonce="abc123" - 或对静态内联脚本计算 SHA256 哈希,写入
script-src 'self' 'sha256-xxx...' - 彻底移除无签名的内联脚本,改为外部文件加载 —— 这是最干净的长期方案
启用违规报告辅助监控
添加 report-to 或传统 report-uri,让浏览器在拦截非法外发请求时上报详情:
- 例如:
Content-Security-Policy: ... connect-src 'self'; report-to csp-endpoint - 后端接收报告后,可分析是否出现异常连接尝试(如向未知域名的 fetch),及时发现绕过行为
- 注意:报告本身不阻止攻击,但提供可观测性,是调优策略的关键依据











