Cookies

程序员小x大约 6 分钟

Cookies

什么是 CSRF 攻击?

CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种攻击方式,攻击者通过诱导用户访问恶意链接或网站,伪造用户的身份并执行恶意操作。攻击者利用用户在已登录网站上的身份,借此向网站发送伪造的请求,而服务器无法识别出这些请求是否是用户本人的意图,从而可能导致敏感操作(如资金转账、修改个人信息等)被执行。

CSRF 攻击的工作原理:

  1. 用户已登录目标网站: 用户在银行或社交网站等已登录并保持会话(cookie未过期)。
  2. 攻击者构造恶意请求: 攻击者在其恶意网站或邮件中嵌入恶意链接或脚本。
  3. 用户点击恶意链接: 用户点击该链接时,浏览器会自动携带当前网站的会话cookie,向目标网站发送请求,伪装成用户发起的合法操作。
  4. 网站误认为请求来自用户: 由于请求携带有效的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>

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 攻击,常用的方法包括:

  1. 使用 CSRF Token:每个敏感请求都需要附带一个随机生成的token,服务器验证请求是否合法。
  2. SameSite Cookie:设置 cookie 的 SameSite 属性,防止跨站点请求携带用户cookie。
  3. Referer/Origin 校验:检查请求的来源,确保请求是来自合法页面。
  4. 用户行为确认:如验证码、二次确认等,确保操作是由用户主动发起的。
  5. HTTP 动作限制:限制敏感操作只使用 POST 请求,并要求身份验证。
  6. Session 超时机制:避免用户会话长时间有效,及时过期以防攻击。

通过这些防范措施,网站可以大大降低被CSRF攻击的风险,保护用户数据的安全。

Loading...