点击劫持与防护头
点击劫持把目标站点嵌进透明 iframe,让已登录用户在不知情的情况下点到真实按钮,完成转账、授权、改密等操作。防护方式是在响应头声明框架策略:X-Frame-Options 兼容性好但控制粗,CSP 的 frame-ancestors 支持按来源精细放行。两个头同时存在时,浏览器以 frame-ancestors 为准。
基本信息
| 防护头 | X-Frame-Options、Content-Security-Policy 的 frame-ancestors |
|---|---|
| 常用取值 | DENY、SAMEORIGIN、frame-ancestors 'none' 或 'self' |
| 优先级 | frame-ancestors 优先于 X-Frame-Options |
| 覆盖范围 | 所有交互页面与表单页,不只是首页 |
| 辅助手段 | 高危操作加二次确认与操作凭证(前端框架防御只能兜底) |
| 验证方式 | curl 看响应头,或本地搭 iframe 页面观察是否被拒绝渲染 |
取值与适用场景
| 配置 | 效果 | 适用场景 |
|---|---|---|
| X-Frame-Options: DENY | 禁止任何来源嵌套 | 无嵌入需求的业务系统 |
| X-Frame-Options: SAMEORIGIN | 仅同源页面可嵌套 | 站内确实存在 iframe 复用 |
| frame-ancestors 'none' | 禁止嵌套,控制更彻底 | 新系统推荐配置 |
| frame-ancestors 'self' | 仅允许同源嵌套 | 需要精细控制的场景 |
| frame-ancestors 指定域名 | 只放行明确来源 | 门户嵌入子系统的架构 |
Nginx 配置
Nginx 配置
# 方式一:X-Frame-Options(兼容老浏览器)
add_header X-Frame-Options "DENY" always;
# 方式二:CSP frame-ancestors(推荐,可指定来源)
add_header Content-Security-Policy "frame-ancestors 'self';" always;
# 需要被门户嵌入时,只放行指定来源
# add_header Content-Security-Policy "frame-ancestors 'self' https://portal.example.com;" always;
# 两个头同时存在时以 frame-ancestors 为准验证方式
验证方式
# 看响应头是否下发,注意 always:错误页也要带头
curl -sI https://example.com/login | grep -i -E 'x-frame-options|content-security-policy'
# 本地构造 iframe 页面,用浏览器打开观察是否被拒绝渲染
# 多页面抽查:登录、转账、授权、改密等交互页逐页确认典型使用场景
- 业务系统安全加固与合规检查项
- 渗透测试报告中点击劫持问题的整改
- 门户嵌入子系统时的白名单设计
- 多站点统一响应头治理
- 新旧系统切换时确认头部没有丢失
- 前端改版后回归头部是否仍然下发
两个头同时存在时以 frame-ancestors 为准。按业务需要选择 DENY 或 SAMEORIGIN;确实需要嵌入时,只放行明确列举的来源,不要用通配。
只加响应头不等于全站安全:涉及转账、授权、改密等高危操作,仍建议加二次确认与操作凭证,避免单点防护被绕过。