点击劫持-介绍
这篇笔记围绕点击劫持的基本原理和防护响应头展开,适合正在为 Web 应用补齐基础安全配置的后端或全栈开发者阅读。文中用银行转账页面被攻击者通过透明 iframe 嵌入恶意页面的例子,说明用户可能在不知情的情况下点击到真实站点上的操作入口,从而触发非预期行为。防护重点放在两个响应头:X-Frame-Options: DENY 用于直接禁止页面被任何站点以 frame 或 iframe 方式嵌入,SAMEORIGIN 则允许同源嵌入,而 ALLOW-FROM 已不适合依赖现代浏览器支持。另一种方式是使用 CSP 中的 frame-ancestors 'none',它同样用于限制页面作为祖先框架中的子页面出现,并且比传统 X-Frame-Options 更现代、可扩展。文章最后给出 FastAPI 中间件写法,在每次响应返回前统一添加 X-Frame-Options、Content-Security-Policy、X-Content-Type-Options 和 Referrer-Policy,分别覆盖点击劫持、iframe 限制、MIME 嗅探和 referrer 泄露等基础风险。整体价值在于把点击劫持的攻击场景与可落地的安全头配置连接起来,可作为 FastAPI 项目的最小安全响应头参考。
目录#
[[toc]]
介绍#
🔐 什么是点击劫持(Clickjacking)?
是一种攻击方式,攻击者在自己的网页中用 <$2> 偷偷嵌入你的网站,然后诱导用户点击,从而在你的网站上执行操作。
举个例子:
• 你的网站是银行后台:https://bank.com/transfer
• 攻击者在自己的页面里偷偷这样写:
<iframe src="https://bank.com/transfer" style="opacity: 0; position: absolute; z-index: 999;"></iframe>
✅ 如何防御?
就是你加的这两行 header:
1. X-Frame-Options: DENY
• 含义:绝不允许被任何网站通过 <$2> 引入
• 替代值还有:
• SAMEORIGIN:只允许同源网站嵌入
• ALLOW-FROM uri:只允许某个域名嵌入(现代浏览器不支持了)
2. Content-Security-Policy: frame-ancestors 'none'
• 是 CSP 的一部分,作用跟上面那个类似,但更灵活
• 'none' 表示:所有 <$2> 嵌套都禁止
• 这个比 X-Frame-Options 更现代,支持更多场景
完全一样的作用,它就是在响应头中加:
X-Frame-Options: DENY
如果你想,我还可以帮你整理一份标准的「FastAPI 安全响应头配置」,包括: • Strict-Transport-Security • X-Content-Type-Options • Referrer-Policy • Permissions-Policy
安全响应头#
通用的安全头响应
class SecureHeadersMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next):
response: Response = await call_next(request)
# 💡 安全相关响应头
response.headers["X-Frame-Options"] = "DENY" # 防止点击劫持
response.headers["Content-Security-Policy"] = "frame-ancestors 'none'" # 现代的iframe 限制
response.headers["X-Content-Type-Options"] = "nosniff" # 防止MIME类型混淆
response.headers["Referrer-Policy"] = "no-referrer" # 防止referrer泄露
return response
评论
还没有评论,来发第一个吧