跨站请求伪造(Cross-Site Request Forgery,CSRF)是一种网络安全攻击手段,攻击者利用受害者的身份,在受害者不知情的情况下发起未经授权的操作。CSRF 攻击的关键在于利用受害者在目标网站上的已有登录凭证。
以下是一个简化的 CSRF 攻击示例:
假设有一个银行网站,用户登录后可以进行转账操作。转账操作的请求格式如下
POST /transfer
{
"to_account": "123456",
"amount": "100"
}
攻击者发现银行网站没有对请求进行 CSRF 保护,于是制作了一个恶意网站,向所有访问者展示如下表单:
<form action="https://bank.example.com/transfer" method="POST">
<input type="hidden" name="to_account" value="attackers_account" />
<input type="hidden" name="amount" value="1000" />
<input type="submit" value="点击领取免费礼品" />
</form>
当受害者访问这个恶意网站并点击“领取免费礼品”按钮时,浏览器会向银行网站发送一个转账请求。由于受害者可能已经登录了银行网站,所以其浏览器会自动附带登录凭证(如 Cookie)。银行网站收到请求后,误认为这是受害者发起的合法操作,并执行转账。
为了防止 CSRF 攻击,开发者需要采取一定的安全措施:
- 使用 CSRF 令牌:为每个会话生成一个随机的 CSRF 令牌,并在表单中添加该令牌。当用户提交表单时,检查请求中的令牌与会话中存储的令牌是否匹配。这样,攻击者在制作恶意表单时无法知道正确的 CSRF 令牌,从而阻止攻击。
- 验证请求来源:检查请求的来源(如 HTTP 头中的 Referer 和 Origin),确保请求来自合法的网站。
- 使用 SameSite Cookie:将登录凭证(如 Cookie)设置为 SameSite,这样浏览器会阻止跨站请求携带 Cookie。这可以在一定程度上防止 CSRF 攻击。
- 手动带参数:通过参数等方式手动带,可以避免 CSRF 攻击
通过这些措施,可以降低网站受到 CSRF 攻击的风险。