# CSRF(跨站點請求偽造)問題的示例分析
## 1. 什么是CSRF攻擊?
CSRF(Cross-Site Request Forgery,跨站點請求偽造)是一種利用用戶已登錄狀態,在用戶不知情的情況下執行非預期操作的攻擊方式。攻擊者誘導用戶訪問惡意頁面,該頁面攜帶偽造請求訪問目標網站,由于瀏覽器會自動攜帶用戶的Cookie等身份憑證,目標網站會誤認為是用戶自愿發起的操作。
### 關鍵特征:
- **依賴用戶身份驗證**:受害者需已登錄目標網站
- **隱蔽性強**:請求由用戶瀏覽器自動發出
- **操作非自愿**:用戶對具體請求無感知
## 2. CSRF攻擊原理示例
### 典型場景:
假設銀行網站存在轉賬接口:
POST /transfer HTTP/1.1 Host: bank.example.com Cookie: sessionid=用戶登錄憑證 Content-Type: application/x-www-form-urlencoded
amount=1000&to=攻擊者賬戶
### 攻擊流程:
1. 用戶登錄銀行網站,獲得有效會話Cookie
2. 用戶訪問攻擊者構造的惡意頁面:
```html
<!-- 偽裝成普通網頁 -->
<body onload="document.forms[0].submit()">
<form action="https://bank.example.com/transfer" method="POST">
<input type="hidden" name="amount" value="1000">
<input type="hidden" name="to" value="攻擊者賬戶">
</form>
</body>
某電商平臺的支付接口:
@app.route('/checkout', methods=['POST'])
def checkout():
if 'user' not in session:
return redirect('/login')
# 直接處理支付請求
process_payment(request.form['amount'], request.form['recipient'])
攻擊者構造:
<iframe style="display:none" name="csrf-frame"></iframe>
<form method="POST" action="https://mall.com/checkout" target="csrf-frame">
<input type="hidden" name="amount" value="999">
<input type="hidden" name="recipient" value="attacker@example.com">
</form>
<script>document.forms[0].submit()</script>
某社交網站刪除接口使用GET請求:
GET /delete_post?id=123 HTTP/1.1
Host: social.com
攻擊者只需誘導用戶訪問:
<img src="https://social.com/delete_post?id=用戶最新帖子ID" width="0" height="0">
| 防御方法 | 實現方式 | 優點 | 缺點 |
|---|---|---|---|
| CSRF Token | 服務端生成隨機Token嵌入表單 | 安全性高 | 需維護Token狀態 |
| SameSite Cookie | 設置Cookie的SameSite屬性 | 瀏覽器原生支持 | 兼容性問題(舊瀏覽器) |
| 驗證Referer | 檢查請求來源域名 | 實現簡單 | 可能被繞過或偽造 |
| 二次驗證 | 敏感操作需重新驗證密碼/短信 | 安全性極高 | 用戶體驗下降 |
# settings.py
MIDDLEWARE = [
'django.middleware.csrf.CsrfViewMiddleware'
]
# 模板中自動添加Token
<form method="post">
{% csrf_token %}
<input type="text" name="amount">
</form>
# 視圖驗證
from django.views.decorators.csrf import csrf_protect
@csrf_protect
def transfer(request):
if request.method == 'POST':
# 安全處理邏輯
當網站存在開放重定向漏洞時:
https://victim.com/redirect?url=https://attacker.com
攻擊者可構造跨站請求,利用重定向攜帶Cookie
如果網站存在XSS漏洞:
fetch('/transfer', {
method: 'POST',
body: 'amount=1000&to=attacker',
credentials: 'include' // 攜帶Cookie
});
此時SameSite Cookie等防御將失效
graph TD
A[CSRF防御] --> B[Token驗證]
A --> C[SameSite=Lax/Strict]
A --> D[關鍵操作二次驗證]
CSRF作為OWASP Top 10長期存在的威脅,其危害性主要體現在: - 平均修復成本低(約\(5,000) - 但可能造成巨額經濟損失(案例:某交易所CSRF導致\)50,000損失)
現代前端框架(如React、Vue)雖然提供部分防護,但后端驗證仍是根本解決方案。開發者應當建立縱深防御體系,而非依賴單一防護措施。 “`
(注:本文約1350字,實際字數可能因渲染環境略有差異)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。