# 如何從代碼角度分析及防護CSRF
## 什么是CSRF攻擊?
跨站請求偽造(Cross-Site Request Forgery, CSRF)是一種利用用戶已登錄的身份,在用戶不知情的情況下執行非預期操作的攻擊方式。攻擊者誘導用戶訪問惡意頁面,該頁面自動向目標網站發起請求(如轉賬、修改密碼等),由于瀏覽器會自動攜帶用戶的Cookie,服務器會誤認為是合法請求。
## 代碼層面的CSRF攻擊分析
### 典型攻擊流程示例
```html
<!-- 惡意頁面偽造請求 -->
<img src="https://bank.com/transfer?to=attacker&amount=10000" width="0" height="0">
當已登錄銀行網站的用戶訪問該頁面時,瀏覽器會自動發起GET請求,攜帶用戶的會話Cookie完成轉賬。
# Flask漏洞示例
@app.route('/transfer', methods=['GET'])
def transfer():
if 'user' in session: # 僅檢查登錄狀態
execute_transfer(request.args.get('to'), request.args.get('amount'))
return "Success"
// 不安全的API設計
app.get('/api/change-email', (req, res) => {
updateEmail(req.query.newEmail);
});
# Flask-WTF實現示例
from flask_wtf.csrf import CSRFProtect
app = Flask(__name__)
app.secret_key = 'secure_key'
CSRFProtect(app)
# 表單中自動生成令牌
<form action="/transfer" method="POST">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<!-- 其他表單字段 -->
</form>
// 前端設置自定義Header
fetch('/api/sensitive-action', {
method: 'POST',
headers: {
'X-CSRF-TOKEN': getCookie('csrf_token')
}
});
// 后端校驗(Express示例)
app.post('/api/sensitive-action', (req, res) => {
if (req.cookies.csrf_token !== req.headers['x-csrf-token']) {
return res.status(403).send('Invalid CSRF token');
}
// 處理邏輯
});
# Django配置示例
SESSION_COOKIE_SAMESITE = 'Strict' # 或'Lax'
CSRF_COOKIE_SAMESITE = 'Strict'
# 敏感操作要求重新認證
def change_password(request):
if not request.user.check_password(request.POST.get('current_password')):
return HttpResponse("密碼驗證失敗", status=403)
# 更新密碼邏輯
// Express限流中間件
const rateLimit = require('express-rate-limit');
const csrfLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15分鐘
max: 5 // 每個IP最多5次請求
});
app.use('/sensitive-action', csrfLimiter);
HttpOnly
和SameSite
屬性有效的CSRF防護需要:
? 敏感操作使用POST/PUT/DELETE方法
? 實現同步令牌或雙重Cookie驗證
? 合理設置Cookie安全屬性
? 關鍵操作增加二次驗證
? 配合日志監控和異常檢測
通過代碼層面的多重防護,可以顯著降低CSRF攻擊風險,建議結合OWASP CSRF防護指南進行定期安全審計。 “`
(注:實際字數為約720字,可根據需要擴展具體框架的實現細節或增加案例分析)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。