CSRF--跨站请求伪造
什么是CSRF?
CSRF是一种通过伪造用户身份来完成未授权操作的攻击方式。攻击者利用受害者已登录状态下的身份凭证(如Cookie),在受害者不知情的情况下发送恶意请求,从而让目标系统执行攻击者意图的操作。
CSRF的攻击原理
- 用户登录到受信任的网站A,并生成了有效的会话凭证(如Cookie)。
- 用户未注销网站A,保持登录状态。
- 用户访问了攻击者控制的恶意网站B。
- 恶意网站B向网站A发送请求(可能是表单提交、图片加载、JavaScript等)。
- 网站A根据请求中的Cookie认为请求是合法的,并执行操作。
CSRF的典型攻击场景
- 恶意资金转账
- 攻击者诱导用户点击恶意链接,触发对银行系统的资金转账请求。
- 账户信息更改
- 攻击者伪造请求更改受害者的个人信息、密码或邮箱。
- 发送恶意请求
- 利用受害者身份在论坛、社交平台等发布垃圾信息。
CSRF的危害
- 身份盗用: 攻击者冒充受害者执行敏感操作。
- 数据泄露: 可能修改或窃取用户数据。
- 系统破坏: 利用管理员权限删除资源或更改系统设置。
CSRF的防御措施
1. 使用CSRF Token
- 在表单或请求中附加一个随机生成的唯一Token。
- 服务器验证Token是否匹配,避免伪造请求。
- 示例:
<input type="hidden" name="csrf_token" value="random_token_value">
- 服务端校验:
if request.form['csrf_token'] != session['csrf_token']: return "Invalid CSRF Token"
2. 验证Referer或Origin
- 检查请求头的Referer或Origin字段,确认请求来源是否是合法域名。
- 缺点:可能被中间代理或浏览器禁用。
3. 使用SameSite Cookie
- 设置Cookie的
SameSite
属性,限制跨站请求时携带Cookie。Set-Cookie: sessionid=abc123; SameSite=Strict
- 值说明:
Strict
:禁止所有跨站点请求携带Cookie。Lax
:允许部分安全的跨站请求(如GET表单提交)。
4. 要求用户验证
- 在执行敏感操作前,要求用户输入密码或进行二次验证。
5. 避免GET请求执行敏感操作
- 使用POST方法处理修改或删除类的操作,避免通过GET暴露。
6. 限制跨域请求
- 使用CORS(跨域资源共享)策略,限制跨站请求访问。
7. 设置验证码
- 重要操作前通过验证码确认用户身份,防止自动化攻击。
CSRF与XSS的区别
特性 | CSRF | XSS |
---|---|---|
攻击对象 | 服务器 | 客户端浏览器 |
利用方式 | 借助用户已登录状态伪造请求 | 注入恶意脚本并在用户浏览器中执行 |
攻击目的 | 伪造用户请求执行未授权操作 | 窃取用户数据、会话或诱导执行恶意操作 |
主要防御手段 | CSRF Token、SameSite Cookie、Referer验证 | 输入验证、输出转义、内容安全策略(CSP) |
总结
CSRF通过利用用户身份欺骗服务器,可能导致严重的业务风险。为了有效防御CSRF攻击,应综合使用CSRF Token、Referer验证、SameSite Cookie等技术手段,结合合理的请求设计和用户身份验证机制,从根本上消除隐患。