CSRF
CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种网络攻击方式,它通过冒充用户发送请求来执行未经授权的操作。攻击者利用受害者在已认证的网站上的身份,以欺骗性的方式让受害者的浏览器向该网站发送请求,从而执行敏感操作,比如更改密码、提交表单、购买商品等。CSRF 攻击主要依赖于用户已经登录并拥有有效的认证凭证(如 Cookie)。
1 CSRF 保护的作用
CSRF 保护的主要目的是防止攻击者伪造请求,利用用户的身份执行未授权的操作。它通过验证请求的合法性,确保每个请求是用户有意发起的。
CSRF 攻击利用了浏览器的自动凭证发送机制,例如当用户登录后,浏览器会自动携带 Cookie 中的身份信息发出请求。攻击者可以诱导用户访问一个恶意网站或点击一个恶意链接,这个链接会触发用户的浏览器向目标网站发送请求,冒充用户执行操作。CSRF 保护通过多种机制来防止这些攻击,确保每个请求的来源是可信的。
2 CSRF 保护的工作机制
CSRF Token:
- 在页面加载时,服务器为每个会话生成一个唯一的 CSRF Token,并在 HTML 页面中通过隐藏字段或者 HTTP 头部传递给客户端。
- 客户端每次发出请求(尤其是 POST、PUT、DELETE 等修改性操作)时,必须将这个 Token 一同发送回服务器。
- 服务器会验证 Token 是否有效。如果 Token 不匹配,服务器拒绝该请求。
SameSite Cookie:
- SameSite 是一种防止 CSRF 攻击的 Cookie 属性,通过限制浏览器是否可以在跨站点请求中发送该 Cookie。
- 如果 Cookie 被设置为
SameSite=Strict
,则只允许浏览器在来自同一站点的请求中发送该 Cookie。
3 典型的 CSRF 攻击场景
假设用户已经登录某个银行网站,并且拥有有效的身份验证 Cookie。攻击者诱导用户访问一个恶意网站,恶意网站上的代码试图向银行发送转账请求:
<img src="https://bank.com/transfer?amount=1000&to=attacker_account" />
用户的浏览器会自动携带银行网站的 Cookie,银行服务器可能认为这是合法请求并执行转账操作。如果没有 CSRF 保护,用户的账户资金会被转移给攻击者。
4 CSRF 保护在实际应用中的作用
- 验证请求的来源:通过 CSRF Token 或
SameSite
Cookie,服务器可以区分用户是主动发起请求,还是因为点击了恶意链接或其他方式伪造的请求。 - 保护敏感操作:CSRF 保护主要用于 POST、PUT、DELETE 等修改性操作,防止数据被篡改或意外提交。
5 Spring Security 的 CSRF 保护
Spring Security 默认会启用 CSRF 保护,以防止跨站请求伪造攻击。在默认配置下,每次用户发起敏感操作时,系统都会验证 CSRF Token。CSRF 保护主要针对表单提交的情况,防止攻击者利用用户的身份发起未授权的请求。
如果你禁用了 CSRF 保护(如 csrf.enabled=false
),系统将不会验证请求中的 CSRF Token,这可能使应用容易受到 CSRF 攻击。因此,除非你明确知道不需要 CSRF 保护的场景(例如 API 主要通过 token 认证且不依赖于 Cookie),否则一般建议保留 CSRF 保护。
6 何时可以禁用 CSRF 保护
- 如果应用是纯粹的 API 服务,不使用浏览器会话认证(例如使用 JWT 或其他无状态的认证方式),你可以禁用 CSRF。
- 内部系统且网络隔离良好,外部无法直接访问的应用,也可以根据情况考虑禁用。
7 总结
CSRF 保护是为了防止跨站请求伪造攻击,确保每个请求的来源是可信的。它通过验证请求中的 CSRF Token,有效防止攻击者冒充用户身份执行未授权操作,是确保 Web 应用安全的重要机制之一。