推荐答案
在 FastAPI 中,可以通过以下步骤来防止跨站请求伪造 (CSRF) 攻击:
- 使用 CSRF Token:在表单或请求中包含一个 CSRF Token,并在服务器端验证该 Token 的有效性。
- 设置 SameSite Cookie:将 Cookie 的
SameSite属性设置为Strict或Lax,以防止跨站请求携带 Cookie。 - 验证请求来源:检查请求的
Referer或Origin头部,确保请求来自受信任的源。
以下是一个简单的 FastAPI 实现示例:
// www.javascriptcn.com code example
from fastapi import FastAPI, Request, Form, Depends, HTTPException
from fastapi.responses import HTMLResponse
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from pydantic import BaseModel
import secrets
app = FastAPI()
# 生成 CSRF Token
def generate_csrf_token():
return secrets.token_hex(16)
# 存储 CSRF Token
csrf_tokens = {}
# 验证 CSRF Token
def verify_csrf_token(token: str):
if token not in csrf_tokens:
raise HTTPException(status_code=403, detail="Invalid CSRF Token")
return True
@app.get("/form", response_class=HTMLResponse)
async def get_form():
csrf_token = generate_csrf_token()
csrf_tokens[csrf_token] = True
return f"""
<form action="/submit" method="post">
<input type="hidden" name="csrf_token" value="{csrf_token}">
<input type="text" name="data">
<button type="submit">Submit</button>
</form>
"""
@app.post("/submit")
async def submit_form(request: Request, csrf_token: str = Form(...)):
verify_csrf_token(csrf_token)
# 处理表单数据
return {"message": "Form submitted successfully"}本题详细解读
1. CSRF Token 的使用
CSRF Token 是一种常见的防御机制,通过在表单或请求中包含一个随机生成的 Token,并在服务器端验证该 Token 的有效性,来防止跨站请求伪造攻击。在 FastAPI 中,可以通过生成一个随机的 Token 并将其存储在服务器端(如内存或数据库)来实现这一点。
2. SameSite Cookie 的设置
SameSite 是 Cookie 的一个属性,用于控制 Cookie 是否在跨站请求中发送。将 SameSite 设置为 Strict 或 Lax 可以有效防止跨站请求伪造攻击。Strict 模式会完全禁止跨站请求携带 Cookie,而 Lax 模式则允许某些安全的跨站请求(如导航)携带 Cookie。
3. 请求来源的验证
通过检查请求的 Referer 或 Origin 头部,可以确保请求来自受信任的源。如果请求的 Referer 或 Origin 头部与预期的源不匹配,则可以拒绝该请求。
4. 示例代码解析
在示例代码中,我们首先生成一个随机的 CSRF Token 并将其存储在服务器端的内存中。然后在表单中嵌入该 Token,并在提交表单时验证该 Token 的有效性。如果 Token 无效,则返回 403 错误。
通过以上步骤,可以有效地防止跨站请求伪造攻击,保护 FastAPI 应用的安全性。