介绍
🔐 什么是点击劫持(Clickjacking)?
是一种攻击方式,攻击者在自己的网页中用 <iframe> 偷偷嵌入你的网站,然后诱导用户点击,从而在你的网站上执行操作。
举个例子:
• 你的网站是银行后台: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
• 含义:绝不允许被任何网站通过 <iframe> 引入
• 替代值还有:
• SAMEORIGIN:只允许同源网站嵌入
• ALLOW-FROM uri:只允许某个域名嵌入(现代浏览器不支持了)
2. Content-Security-Policy: frame-ancestors ‘none’
• 是 CSP 的一部分,作用跟上面那个类似,但更灵活
• ‘none’ 表示:所有 iframe 嵌套都禁止
• 这个比 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