一句话说透计算机网络里面的CSRF攻击?如何避免

229 阅读2分钟

一句话总结:
CSRF攻击就像骗子伪造你的签名去银行转账——利用你的登录状态偷偷干坏事!防御方法是给操作加暗号(Token)、检查来源(Referer)、设置快递拒收陌生包裹(SameSite Cookie)!


一、CSRF攻击原理(外卖骗局比喻)

场景

  1. 你登录了外卖平台(已认证),还没退出。
  2. 骗子发你一个链接:“点这里领红包!”
  3. 你点击后,页面偷偷向外卖平台发请求:“把收货地址改成骗子家!”
  4. 外卖平台看到是你登录的,直接执行操作。

关键点

  • 利用信任:浏览器自动携带你的Cookie(登录凭证)。
  • 无需窃密:攻击者不需要知道你的密码,只要诱骗你点击链接。

二、防御方法(三步护身术)

1. 加暗号:CSRF Token

  • 原理:每个表单生成唯一Token(如一次性密码),提交时校验。

  • 代码示例

    <!-- 表单中嵌入Token -->  
    <form action="/change_address" method="POST">  
      <input type="hidden" name="csrf_token" value="随机字符串">  
      <input type="text" name="new_address">  
      <button>提交</button>  
    </form>  
    
  • 效果:攻击者无法伪造Token,请求被拒绝。

2. 查来源:验证Referer头

  • 原理:检查请求是否来自合法页面(如只允许本站来源)。

  • 代码示例(伪代码):

    if request.referer not in allowed_domains:  
        return error("非法请求来源!")  
    
  • 缺点:Referer可能被篡改或隐私模式下缺失。

3. 快递拒收:SameSite Cookie

  • 原理:设置Cookie的SameSite属性,限制跨站请求携带Cookie。

    • Strict:完全禁止跨站携带(如银行转账)。
    • Lax:允许部分安全请求(如导航跳转)。
    • None:允许携带,但必须配合Secure(HTTPS)。
  • 代码示例

    Set-Cookie: session_id=abc123; SameSite=Lax; Secure  
    

三、进阶防御(组合拳)

  1. 敏感操作二次验证

    • 修改密码、转账前需输入短信验证码或当前密码。
  2. 自定义请求头

    • AJAX请求添加自定义头(如X-Requested-With: XMLHttpRequest),后端校验。
  3. 定期更换Token

    • Token绑定用户会话,会话过期则Token失效。

四、常见框架的CSRF防护

框架防护方式启用方法
Django自动生成和校验CSRF Token表单中加{% csrf_token %}
Spring Security默认启用CSRF防护需配合Thymeleaf使用<input type="hidden" name="_csrf">
Express使用中间件(如csurfapp.use(csurf())

五、总结口诀

“CSRF攻击悄无声,利用登录乱折腾。
防御三招要牢记:Token、来源、Cookie禁。
框架自带防护盾,敏感操作加验证。
安全策略组合用,网站牢固如长城!”