web安全:跨站请求伪造(CSRF)
- 互联网
- 2025-08-24 21:57:02

跨站请求伪造 (CSRF)
跨站请求伪造(CSRF,Cross-Site Request Forgery) 是一种网络攻击方式,攻击者诱使受害者在未经其授权的情况下执行特定操作。CSRF 利用受害者已登录的身份和浏览器自动发送的认证信息(如 Cookie)来冒充受害者,发起未经授权的请求。此攻击通常会导致严重的安全问题,特别是在银行、电子商务和社交网络等网站上。
CSRF 攻击的工作原理 银行转账操作案例
用户登录银行网站 用户访问银行网站并登录,提交登录凭据后,银行生成会话 Cookie 并存储在浏览器中:
Cookie: JSESSIONID=randomid用户在登录后未注销,浏览器保存此 Cookie 用于后续的认证。
银行提供的合法转账表单 银行网站的转账表单如下:
<form method="post" action=" bank.example /transfer"> <input type="text" name="amount" placeholder="Amount" /> <input type="text" name="routingNumber" placeholder="Routing Number" /> <input type="text" name="account" placeholder="Account Number" /> <input type="submit" value="Transfer" /> </form>用户提交数据后,浏览器发送如下请求:
POST /transfer HTTP/1.1 Host: bank.example Cookie: JSESSIONID=randomid Content-Type: application/x- -form-urlencoded amount=200&routingNumber=1234&account=5678攻击者设置陷阱 攻击者创建了一个恶意网站,并设计了一段 HTML 代码模拟银行的转账操作:
<form method="post" action=" bank.example /transfer"> <input type="hidden" name="amount" value="500" /> <input type="hidden" name="routingNumber" value="attackerRouting" /> <input type="hidden" name="account" value="attackerAccount" /> <input type="submit" value="Click to Claim Prize" /> </form>攻击者诱使用户访问该页面,用户无意间点击了提交按钮,触发请求。
后果 浏览器发送以下请求到银行服务器:
POST /transfer HTTP/1.1 Host: bank.example Cookie: JSESSIONID=randomid Content-Type: application/x- -form-urlencoded amount=500&routingNumber=attackerRouting&account=attackerAccount银行服务器因为依赖 Cookie 自动认证,误以为是用户本人发起的合法操作,将资金转入攻击者账户。
CSRF 的核心特点 自动发送凭据 浏览器会自动携带与目标网站相关的 Cookie 和其他认证信息。用户无感知 用户通常不会察觉攻击的发生,因为它可能嵌入在正常网页或隐藏的代码中。利用受信任身份 服务器将受害者的身份视为合法,因此执行攻击者设计的操作。
CSRF 攻击的危害 资金损失:攻击者可通过伪造请求进行转账或支付操作。数据篡改:攻击者可修改用户数据,如更改密码、邮箱等。账户劫持:攻击者可利用 CSRF 攻击获取用户权限,进一步控制账户。服务滥用:攻击者可利用受害者的身份执行恶意操作,如发送垃圾邮件或发起 DDoS 攻击。
防范 CSRF 攻击的方法 1. 使用 CSRF Token
在表单或请求中添加一个随机生成的 Token,服务器验证该 Token 是否匹配。
示例:
<form method="post" action="/transfer"> <input type="hidden" name="csrf_token" value="randomly_generated_token" /> <input type="text" name="amount" /> <input type="submit" value="Transfer" /> </form> 2. 验证请求来源检查 Referer 或 Origin 头部,确保请求来自合法的源。
示例:
Referer: bank.example Origin: bank.example 3. 使用 SameSite Cookie设置 Cookie 的 SameSite 属性为 Strict 或 Lax,防止跨站请求携带 Cookie。
示例:
Set-Cookie: JSESSIONID=randomid; SameSite=Strict 4. 限制安全方法 确保安全方法(如 GET、HEAD、OPTIONS)是只读的,不用于修改数据。示例: 使用 POST 或 PUT 方法执行写操作。避免使用 GET 方法执行敏感操作。 5. 双重认证 对敏感操作(如转账、修改密码)要求用户进行双重认证,例如输入短信验证码。 6. 定期安全测试 使用自动化工具(如 OWASP ZAP)进行安全测试,检查是否存在 CSRF 漏洞。其他防护建议 避免直接使用 GET 方法进行状态改变:避免使用 GET 请求来执行会影响服务器状态的操作,例如提交表单、修改数据等。始终使用 POST 方法来进行更改操作。对应用进行安全审计和渗透测试:定期进行 CSRF 漏洞检测,包括使用自动化工具(如 OWASP ZAP)进行测试,确保应用程序没有 CSRF 漏洞。教育用户:虽然大部分防护措施都在技术层面,但用户教育也很重要。提醒用户不要随便点击未知网站的链接或填写不明网站的表单。
扩展阅读 OWASP CSRF Prevention Cheat Sheet《Web应用程序安全权威指南》
web安全:跨站请求伪造(CSRF)由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“web安全:跨站请求伪造(CSRF)”