跨站请求伪造(Cross-Site Request Forgery,简称 CSRF)是指,攻击者诱导用户在已登录某个网站的情况下,向该网站发送非本意的请求,从而执行用户权限范围内的敏感操作(如修改邮箱、转账、删除资源等)。
CSRF 利用了用户对受信任站点的身份认证信息。当用户登录某网站后,浏览器通常会保留该站点的 Cookie、Session 等身份信息。而攻击者通过构造恶意请求,诱导用户在登录状态下访问攻击链接,从而“伪造”用户的请求。CSRF 的核心在于:浏览器会自动携带用户的 Cookie 等认证信息。
攻击成功的前提:
假设银行网站 https://bank.example.com 提供如下接口:
GET /transfer?to=attacker&amount=10000
用户登录银行网站后未登出,此时访问了攻击者构造的页面:
<img src="https://bank.example.com/transfer?to=attacker&amount=10000" />
若服务器未做验证,这个请求会自动携带用户的 Cookie,服务器认为是用户本人发出的请求,从而完成转账。
<img src=""><script src=""><iframe src=""><form method="POST"> + JavaScript 自动提交Referer 容易被隐藏。SameSite=Strict 或 Lax;HTML 页面:
<form method="POST" action="/change_email">
<input type="email" name="email" />
<input type="hidden" name="csrf_token" value="">
<input type="submit" value="提交" />
</form>
后端(Python Flask 示例):
@app.route('/change_email', methods=['POST'])
def change_email():
if request.form['csrf_token'] != session['csrf_token']:
abort(403)
# 执行邮箱修改操作
OWASP CSRFTester。| 项目 | 内容 |
|---|---|
| 漏洞名称 | 跨站请求伪造(CSRF) |
| 利用条件 | 用户已登录目标网站、目标站点未校验请求来源 |
| 攻击方式 | 诱导用户发起非本意请求 |
| 危害等级 | 中到高,视功能权限而定 |
| 防御策略 | 使用 CSRF Token、设置 SameSite Cookie、Referer 校验等 |