前端安全场景之csrf/ssrf

318 阅读2分钟

「这是我参与2022首次更文挑战的第29天,活动详情查看:2022首次更文挑战」。

CSRF

CSRF,全称 cross-site request forgery,跨站请求伪造,即在另一个非法站点伪造了合法站点的请求。 我们构建下安全场景:

  1. 首先你登录了正常的网站页面,bank.com, 获取 cookie 并存储到浏览器中
  2. 攻击者发布了这样一个站点,并诱导你点击
<html>
<body>
  <form action="http://bank.com/transfer" method="POST"> <input type="hidden" name="to" value="hacker" /> <input
      type="hidden" name="amount" value="10000.00" /> </form>
  <script>      document.forms[0].submit();    </script>
</body>
</html>
  1. 在这样一来你的钱就被转出去了,因为你在其它的网站向正常网站的后端发起了一个请求,该请求会带上正常登录的 cookie。

如何进行 CSRF 防护

  1. 使用 CSRF Token 进行防护 跨站脚本用的是 cookie,我们在 cookie 之外、网站本身增加一个 Token 即可。每一次登录都会生成一个随机token,这个 token 只会存在于正常站点内,前端存在 sessionStorage 里,其它网站因为没有整套的鉴权流程,所以是没有这个 token 的,也无法跨域拿到这个 token。
  2. 增加二次防护,敏感操作需要二次验证,比如输入一个验证码,这样就能避免稀里糊涂地钱就没了
  3. 现代浏览器对 cookie 新增了很多限制,默认安全等级不断提升,甚至 chrome 已经在提出替代 cookie 的方案

ssrf

csrf,是指用户提交的代码对前端逻辑有影响,那么如果用户提交的内容被服务器执行了,那会有什么后果?意味着攻击者将拥有服务器的权限,这就是 ssrf(server side request forgery),服务端请求伪造,它还有另外一个名字,就是内网穿透。

如何进行 ssrf 防护

对用户传过来的数据进行白名单限制;对协议和资源类型等进行限制;服务内部的所有接口,都要进行验证,以为 ssrf 伪造的接口都是没有验证信息的