Permissions-Policy 是什么
Permissions-Policy 是响应头,用于按源收紧浏览器能力:摄像头、麦克风、地理位置、全屏、支付等。它是旧 Feature-Policy 的规范替代,语法由「能力名=(允许列表)」组成,空括号表示连本站也禁止;对嵌入的 iframe 还能通过 allow 属性逐项委派。浏览器默认策略本身已较严格,显式声明主要是为了挡住被注入的第三方脚本滥用设备能力。
基本信息
| 字段名 | Permissions-Policy |
|---|---|
| 类型 | 响应头(能力也可经 iframe 的 allow 属性委派) |
| 规范 | W3C Permissions Policy,替代 Feature-Policy |
| 语法 | feature=(allowlist),如 geolocation=() 全禁、geolocation=(self) 仅本站 |
| 生效范围 | 当前文档及其派生的 iframe,受 allow 委派限制 |
典型使用场景
- 上线前统一关闭站点用不到的高敏能力(摄像头、麦克风、定位),降低被注入脚本滥用的面
- 给嵌入的第三方 iframe 划边界:只委派必须的能力,其余一律禁止
- 排查「定位或摄像头 API 报错」:先分清是策略头禁止、iframe 未委派,还是用户拒绝授权
- 多团队共用主域时,限制子路径页面可调用的浏览器 API,避免一处漏洞波及全站
- 安全基线检查:把常用能力的白名单固化进发布模板,随应用一起上线
Nginx 统一收口
Nginx 统一收口
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always; # 默认全禁高敏能力
add_header Permissions-Policy "fullscreen=(self)" always; # 仅本站可用全屏
# iframe 侧委派:只把定位放行给内嵌地图服务
# <iframe src="https://map.example.com/" allow="geolocation"></iframe>取值写法对照
| 写法 | 含义 | 注意点 |
|---|---|---|
| camera=() | 禁止任何来源使用摄像头 | 空括号连本站也不允许 |
| geolocation=(self) | 只允许同源页面使用定位 | self 拼错等于全禁 |
| payment=("https://pay.example.com") | 跨源委派给指定站点 | 域名要带协议,否则不匹配 |
| 默认(不写该头) | 沿用浏览器默认策略 | 并非全部放开,也并非全部禁止 |
浏览器对无法识别的能力名一律忽略,写错名字既不报错也不生效,看起来正常其实是空配置;上线后用开发者工具的应用面板核对当前文档最终生效的策略。
该头只能约束浏览器行为,挡不住服务端代理、爬虫和本地脚本;把它当作纵深防御的一层,不要当成访问控制手段。