问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

跨站请求伪造(CSRF)攻击及其防御措施

创作时间:
作者:
@小白创作中心

跨站请求伪造(CSRF)攻击及其防御措施

引用
CSDN
1.
https://m.blog.csdn.net/qq_44005305/article/details/145964850

CSRF攻击及其防御措施

跨站请求伪造(CSRF)是一种严重的安全漏洞,会危及网络应用。它诱使用户执行他们并不打算执行的操作,从而导致网站上出现未经授权的操作。

CSRF是什么?

CSRF是一种攻击类型,恶意网站会诱骗用户的浏览器向用户 已通过身份验证的不同网站 发出不必要的请求。例如,如果用户登录了自己的网上银行账户,CSRF攻击就会诱使浏览器在用户不知情的情况下转移资金。

CSRF是如何工作的

1: CSRF攻击步骤

  • 用户验证:用户登录受信任的网站(如银行系统),通过cookie维持会话,这一步只有用户才能操作,这是攻击的前提。
  • 恶意网站:黑客通过各种方式 诱骗 用户在不知情的情况下访问恶意网站。
  • 未经授权的请求:恶意网站使用已认证用户的凭据(通常通过cookie)向受信任网站发送请求,这个请求被精心设计,以在受信任网站上执行操作,而用户对此并不知情或未经同意。

恶意网站的程序可能就是一张图片:

<img src="https://bank.example.com/transfer?amount=1000&to=attacker" />

图片中的脚本就会执行JavaScript脚本,携带受信任的网站的Cookie向受信任的网站发送请求。

2: 如何诱骗用户访问恶意网站

攻击的 核心 就是如何 诱骗 用户在不知情的情况下访问恶意网站,大概的方式如下:

  • 钓鱼邮件
  • 被种植木马的第三方网站
  • 社交媒体上的恶意连接

核心的核心就是要触发访问恶意网站,不管是显示点击还是隐式访问。

CSRF的危害

  • 未经授权的交易:转移资金、更改账户设置或执行其他敏感操作。
  • 数据窃取:窃取个人或敏感数据,比如口令等。
  • 用户体验:破坏用户信任,损害网站声誉。

如何避免CSRF攻击

所谓跨站攻击,且使用第三方网站诱骗,那涉及到跨域的问题,大部分解决方案业缘于此。

1: Anti-CSRF Tokens

在请求表单中包含一个唯一的、不可预测的令牌,并在服务器端验证该令牌。

服务器端代码:

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class TransferController {

   @PostMapping("/transfer")
   public ModelAndView transferMoney(@RequestParam("amount") int amount, @RequestParam("to") String to, @RequestParam("csrfToken") String csrfToken) {
       if (!validateCsrfToken(csrfToken)) {
           throw new SecurityException("Invalid CSRF token");
       }
       return new ModelAndView("success");
   }

   private boolean validateCsrfToken(String token) {
       return true;
   }
}

客户端代码:

<form action="/transfer" method="post">
   <input type="hidden" name="csrfToken" value="${csrfToken}">
   <input type="number" name="amount" placeholder="Amount">
   <input type="text" name="to" placeholder="Recipient">
   <button type="submit">Transfer</button>
</form>

2: SameSite Cookies

Cookie同源策略的限制,SameSite是一个用于控制浏览器在跨站请求中发送cookie的属性,可以设置为以下三个值:

  • Strict:只有在同一站点的请求中才会发送cookie。
  • Lax:允许同一站点的请求发送cookie,并且在某些跨站请求中也会发送cookie,比如从外部站点点击链接允许,Ajax请求不允许。
  • None:默认允许执行所有跨站请求。

服务器端代码:

import javax.servlet.http.Cookie;

public class MyServlet extends HttpServlet {
   @Override
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       Cookie csrfCookie = new Cookie("csrfToken", generateCsrfToken());
       csrfCookie.setHttpOnly(true);
       csrfCookie.setSecure(true);
       csrfCookie.setPath("/");
       csrfCookie.setMaxAge(3600);
       csrfCookie.setSameSite("Strict"); // SameSite attribute
       response.addCookie(csrfCookie);
   }

   private String generateCsrfToken() {
       return "generatedToken";
   }
}

3: Referer Header 校验

这也是一种方式,不过很容易伪造。

const express = require('express');
const app = express();

app.post('/transfer', (req, res) => {
   const referer = req.headers.referer;
   if (!referer || !referer.startsWith('https://yourwebsite.com')) {
       return res.status(403).send('Forbidden');
   }
   res.send('Transfer successful');
});

CSRF攻击会带来严重后果,一方面编写代码的时候使用优秀的框架,里面内置了安全防护措施和最佳实践,另外定期对网站进行安全审计,减少攻击的可能性。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号