Cookies
Cookies
Cookie
什么是 CSRF 攻击?
CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种攻击方式,攻击者通过诱导用户访问恶意链接或网站,伪造用户的身份并执行恶意操作。攻击者利用用户在已登录网站上的身份,借此向网站发送伪造的请求,而服务器无法识别出这些请求是否是用户本人的意图,从而可能导致敏感操作(如资金转账、修改个人信息等)被执行。
CSRF 攻击的工作原理:
- 用户已登录目标网站: 用户在银行或社交网站等已登录并保持会话(cookie未过期)。
- 攻击者构造恶意请求: 攻击者在其恶意网站或邮件中嵌入恶意链接或脚本。
- 用户点击恶意链接: 用户点击该链接时,浏览器会自动携带当前网站的会话cookie,向目标网站发送请求,伪装成用户发起的合法操作。
- 网站误认为请求来自用户: 由于请求携带有效的cookie,网站无法区分该请求是恶意的还是用户自发的,因此执行了非法操作。
例子:
假设用户在银行网站登录了账户,并保持登录状态。攻击者诱导用户点击一个恶意链接:
http://bank.com/transfer?to=attacker_account&amount=1000
当用户点击后,浏览器会自动携带银行网站的cookie,导致银行网站误认为这是用户发起的请求,进而执行转账操作。
如何防范 CSRF 攻击?
防范 CSRF 攻击的关键是确保每个敏感请求都能被正确验证,以确保请求是由合法用户发起的。以下是几种常见的防护方法:
1. 使用 CSRF Token
CSRF Token 是一种防伪令牌,每次提交请求时都会生成一个唯一的token并附加在请求中,服务器通过验证token来确认请求的合法性。
- 生成 Token: 用户登录后,服务器为该用户生成一个唯一的CSRF Token,并将其存储在服务器端。
- 附加 Token: 当用户提交表单或发送敏感请求时,服务器会将CSRF Token嵌入到页面中的隐藏字段或请求头中。
- 验证 Token: 每次用户提交请求时,服务器会检查请求中的token是否与服务器存储的token一致。如果一致,则认为请求是合法的,否则拒绝请求。
示例:
<form method="POST" action="/submit">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
<!-- 其他表单字段 -->
<button type="submit">Submit</button>
</form>
2. SameSite Cookie 属性
SameSite 是一个浏览器的cookie属性,它可以限制第三方网站访问当前网站的cookie,减少 CSRF 攻击的风险。
- SameSite=Lax: 只允许在同一站点的请求中发送cookie,但对于某些安全的跨站请求(如GET请求)允许发送cookie。
- SameSite=Strict: 仅允许同一站点的请求发送cookie,完全防止跨站请求携带cookie。
通过设置 SameSite
属性,可以防止攻击者在恶意网站中窃取用户的cookie,并利用这些cookie进行跨站伪造请求。
示例:
Set-Cookie: sessionid=abc123; SameSite=Lax;
3. 使用 Referer 或 Origin 校验
通过检查请求的 Referer(来源页)或者 Origin(请求源)头部,服务器可以判断请求是否来自合法的页面。
- Referer: 表示当前请求的来源页面。
- Origin: 表示请求的源站点,通常在跨站请求中会使用该字段。
在服务器端进行验证时,如果Referer或Origin头与目标站点不符,则可以拒绝该请求。
示例:
@app.route('/submit', methods=['POST'])
def submit():
referer = request.headers.get('Referer')
if not referer or 'trusted-website.com' not in referer:
abort(403) # 拒绝不可信来源的请求
4. 用户行为确认(验证码)
在执行敏感操作(如转账、修改密码等)时,要求用户输入验证码(如验证码或二次确认操作),可以增加攻击者伪造请求的难度。
- 验证码: 用户在提交表单时,必须输入验证码,证明是用户在主动操作。
- 二次确认: 在进行关键操作时(如转账),要求用户通过额外的确认步骤(例如输入密码、短信验证码等)来验证操作。
5. 使用 HTTP 动作限制
通过限制请求类型和动作,可以降低CSRF攻击的风险。
- 对于重要操作,只允许使用 POST 请求,而不是 GET 请求。因为 GET 请求可以轻松通过恶意链接伪造。
- 对于某些敏感操作,可以要求额外的身份验证,如密码、二次认证等。
6. 增加 Session 超时机制
如果用户长时间没有操作,可以强制退出登录。这样即使攻击者伪造请求,用户的会话已经过期,也无法成功提交请求。
- 自动退出机制: 定时检查会话的过期时间,超过一定时间后自动退出。
- 用户提示: 用户操作超时后,要求重新登录。
总结:
CSRF 攻击 是一种通过伪造请求来利用用户的身份执行非法操作的攻击方式。为了有效防范 CSRF 攻击,常用的方法包括:
- 使用 CSRF Token:每个敏感请求都需要附带一个随机生成的token,服务器验证请求是否合法。
- SameSite Cookie:设置 cookie 的 SameSite 属性,防止跨站点请求携带用户cookie。
- Referer/Origin 校验:检查请求的来源,确保请求是来自合法页面。
- 用户行为确认:如验证码、二次确认等,确保操作是由用户主动发起的。
- HTTP 动作限制:限制敏感操作只使用 POST 请求,并要求身份验证。
- Session 超时机制:避免用户会话长时间有效,及时过期以防攻击。
通过这些防范措施,网站可以大大降低被CSRF攻击的风险,保护用户数据的安全。