防范点击劫持需通过Nginx配置X-Frame-Options(如SAMEORIGIN)和CSP frame-ancestors双头策略,按路径差异化设置,并验证响应头生效。

防范点击劫持,核心是阻止恶意网站用 <iframe> 嵌套你的页面。Nginx 本身不处理业务逻辑,但可通过设置安全响应头,从网络层切断嵌入路径。关键不是“加一行头就完事”,而是选对策略、配准范围、留出例外。
用 X-Frame-Options 控制 iframe 嵌入权限
这是最直接、浏览器兼容性最好的防御手段。它只管“能不能被框”,不防 XSS 或 CSRF,但必须有。
- DENY:全站禁止任何嵌入,最严格,适合管理后台、支付页等敏感入口
-
SAMEORIGIN:仅允许同域名下的页面嵌入(如
app.example.com嵌套api.example.com),推荐作为默认策略 - ALLOW-FROM uri:指定单个可信来源(如合作方页面),但 Chrome 和 Firefox 已弃用,仅 Safari 部分支持,慎用
在 Nginx 配置中添加:
add_header X-Frame-Options "SAMEORIGIN" always;搭配 CSP frame-ancestors 实现现代双保险
X-Frame-Options 是旧标准,CSP 的 frame-ancestors 是它的替代和增强。两者共存可兼顾新老浏览器,且后者支持更细粒度控制(如允许多个域名、支持 'none' 和 'self' 关键字)。
- 设为
frame-ancestors 'self';等效于SAMEORIGIN - 设为
frame-ancestors 'none';等效于DENY - 允许多个来源:
frame-ancestors 'self' https://partner.com;
Nginx 中配置示例:
add_header Content-Security-Policy "frame-ancestors 'self';" always;按路径差异化配置,避免误伤功能
不是所有页面都要一刀切禁止嵌入。比如公开的宣传页可能需被嵌入到官网首页,而登录页绝对不能被套;百度统计的“点击图”也依赖 iframe 加载,硬设 DENY 会导致其失效。
- 对敏感路径(
/login、/admin、/transfer)单独设DENY - 对开放页面(
/about、/public-api)可设SAMEORIGIN或留白 - 若需支持特定第三方(如统计、客服 SDK),优先用 CSP 的
frame-ancestors显式声明,而非退回到已废弃的ALLOW-FROM
验证是否生效,别只信配置文件
加了头≠起作用。常见失效原因包括:代理覆盖、PHP/后端重复设置冲突、HTTPS 未强制导致 HTTP 响应不带头、location 块嵌套错误导致 add_header 未继承。
- 用浏览器开发者工具 → Network → 查看任意页面响应头,确认
X-Frame-Options和Content-Security-Policy存在且值正确 - 用 curl 检查:
curl -I https://your-site.com/login - 建一个测试 HTML 文件,尝试用 iframe 加载你的页面,观察是否被拒绝渲染


















