csrf攻击和token

本文介绍了CSRF攻击,以直播网站送礼物和删除礼物接口为例,说明攻击者可通过非法手段让用户在不知情下操作。同时阐述了使用Token防止CSRF攻击的方法,即服务端生成随机数埋入页面,用户请求时带上该随机数,服务端校验,还提醒Token应放于session中。
  • 参考来源

    https://zhuanlan.zhihu.com/p/22521378

  • csrf攻击

    A网站是一个正常的直播类网站可以送礼物,送礼物的接口是 https://xxxx.com/gift/send?target=someone&giftId=ab231 (get和post都行,这里只是一个示例),在用户已登录状态下调用这个接口就可以给someone这个用户送ab231这个礼物;

    B网站可能通过非法链接、网页伪装、图片url外链等操作让用户访问这个接口(可能顺便伪装一下让用户使用用户名和密码登录,也可能很不幸用户在A网站就是登录状态),如果B网站的后端没有采取任何操作,那么用户神不知鬼不觉的就给someone送了礼物;

    但是用户可能会在送礼物历史中发现问题,假设删除礼物的接口是 https://xxxx.com/gift/deleteRecord ,接口类型为POST,请求参数为 { giftId:“ab231”},此时可以再用一个伪装网页进行自动提交、并跳转回首页(而且这个网页是什么也不显示的)

    哈哈,给你开了个玩笑,莫生气~
      <script>
          document.getElementById('form').submit();
          location.href = "http://xxxx.com";
      </script>
    

    如果删除礼物的接口也不采取任何措施的话,那么就再次攻击成功,用户根本不知道礼物已经送出去了

  • 使用token防止csrf攻击

    1. 服务端第一次收到请求时(例如登录),会生成一个随机数,在渲染请求页面时把随机数埋入页面(一般埋入 form 表单内)

       <input type="hidden" name="_csrf_token" value="xxxx">
      
    2. 服务端通过setSession把这个随机数传回浏览器

    3. 用户再次发送请求时,会带上这个随机数(_csrf_token参数)

    4. 服务端会进行校验,如果_csrf_token参数不存在或者检验不通过,则请求不合法

  • 注意事项

    1. token应该放在session中

      如果放在cookie中会出现当浏览器开了很多页面,而一些页面重新种入新的token时,用户会发现一些页面过了几分钟就无法访问了

### XSS攻击CSRF攻击的区别 XSS(跨域脚本攻击CSRF(跨站请求伪造)是两种常见的网络安全攻击方式,它们在攻击原理、目标以及实施条件上存在显著差异。 1. **攻击原理** XSS攻击是通过向网页中注入恶意脚本,使得这些脚本在用户的浏览器上执行,从而窃取用户信息或篡改页面内容。CSRF攻击则是利用用户已经认证的会话信息,伪造用户的请求,使其在不知情的情况下执行某些恶意操作,例如更改账户设置或发起转账[^2]。 2. **实施条件** CSRF攻击需要用户先登录目标网站并获取Cookie或Session信息,攻击者才能以用户的名义发送请求。而XSS攻击并不依赖于用户是否登录,它只需要成功将恶意脚本注入到网页中即可执行[^2]。 3. **攻击目标** XSS攻击主要针对的是网站的内容用户数据,攻击者通过注入的脚本可以访问用户的Cookie、Session等敏感信息,甚至控制用户的浏览器行为。CSRF攻击的目标则是利用用户的合法身份执行未经授权的操作,通常不会直接窃取数据,而是通过伪造请求达到特定目的[^3]。 4. **攻击方式** XSS攻击通常通过在用户输入中插入恶意脚本,例如`<script>`标签或事件处理程序(如`onerror`、`onclick`等),从而在页面加载时自动执行。CSRF攻击则通过诱导用户点击链接或访问恶意网站,向目标网站发送伪造的请求,利用浏览器自动携带的Cookie信息完成攻击[^4]。 --- ### XSS攻击CSRF攻击的防范措施 1. **防范XSS攻击** - **输入过滤**:对用户提交的所有输入进行严格的过滤,移除潜在的危险字符标签,如`<script>`、`<iframe>`、`onerror`、`onclick`等[^5]。 - **输出编码**:在将用户输入的数据输出到页面时,根据上下文进行适当的编码,例如HTML编码、URL编码或JavaScript编码,防止脚本执行。 - **使用CSP(内容安全策略)**:通过设置HTTP头`Content-Security-Policy`,限制页面中只能加载指定来源的脚本,有效阻止内联脚本外部恶意脚本的执行。 - **使用安全框架**:例如在Web开发中使用框架(如React、Angular)时,其默认机制会对动态内容进行转义,减少XSS风险。 2. **防范CSRF攻击** - **使用CSRF Token**:在每个请求中加入一个随机生成的Token,并在服务器端验证该Token的有效性,确保请求来自合法的用户会话。 - **检查Referer头**:服务器可以通过检查HTTP请求头中的`Referer`字段,确认请求是否来自预期的来源,从而防止跨站请求。 - **SameSite Cookie属性**:设置Cookie的`SameSite`属性为`Strict`或`Lax`,限制Cookie在跨站请求中的发送,减少CSRF攻击的可能性。 - **双重提交Cookie**:将CSRF Token同时存储在Cookie请求参数中,服务器验证两者是否一致,确保请求的合法性。 3. **综合安全措施** - **定期更新安全策略**:随着攻击手段的不断演进,必须持续更新防御机制,修补可能存在的漏洞。 - **加强用户安全意识**:教育用户不随意点击不明链接,避免访问可疑网站,降低被攻击的风险。 - **进行安全审计**:对网站进行全面的安全测试代码审查,发现并修复潜在的安全隐患。 --- ```python # 示例:使用Flask框架防止CSRF攻击 from flask import Flask, request, session from flask_wtf.csrf import CSRFProtect app = Flask(__name__) app.config[&#39;SECRET_KEY&#39;] = &#39;your_secret_key&#39; csrf = CSRFProtect(app) @app.route(&#39;/submit&#39;, methods=[&#39;POST&#39;]) def submit(): # 处理提交逻辑 return &#39;Form submitted successfully&#39; ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值