什么是跨域请求未在攻击?浏览器在这方面做了哪些努力? 为什么随机UUID做token 可以解决跨域请求伪造攻击?

跨域请求伪造攻击(Cross-Site Request Forgery,简称CSRF)是一种恶意攻击,其中攻击者诱使用户在已认证的会话中执行未授权的操作。通过在受害者访问的站点中嵌入恶意请求,攻击者可以利用用户的身份来执行一些用户未授权的操作,如转账、修改资料等。

跨域请求伪造攻击(CSRF)

攻击原理

  1. 用户登录认证网站A:用户在浏览器中登录了一个网站A(例如银行网站),并生成了一个有效的会话cookie。
  2. 用户访问恶意网站B:在登录网站A后,用户无意间访问了另一个恶意网站B。
  3. 恶意请求:恶意网站B包含一个恶意脚本,该脚本通过自动提交表单或发送请求,向网站A发送请求。由于用户已经在网站A登录,浏览器会自动附带用户的会话cookie。
  4. 服务器接受请求:网站A收到请求并认为是用户合法操作,因为请求附带了有效的会话cookie。

解决CSRF的常用方法

  1. CSRF Token:在每个敏感操作的请求中包含一个唯一的、不可预测的token。服务器生成并验证这个token,确保请求是由合法用户发起的。
  2. SameSite Cookie 属性:通过设置cookie的SameSite属性,限制跨站点请求中cookie的发送。例如,设置为StrictLax
  3. Referer和Origin检查:服务器检查请求头中的RefererOrigin字段,确保请求来源于可信任的站点。

浏览器在防范CSRF方面的努力

浏览器通过多种方式帮助防范CSRF攻击:

  1. SameSite Cookie 属性:浏览器支持SameSite属性,可以设置cookie只在同站点请求中发送。例如:
    Set-Cookie: sessionid=abc123; SameSite=Strict
    
  2. CORS(跨域资源共享):浏览器实现了严格的跨域请求策略(CORS),默认情况下,浏览器不会允许跨域的资源请求,除非服务器明确允许。

为什么随机UUID做token可以解决CSRF攻击

随机UUID作为CSRF Token的优势

  1. 不可预测性:UUID是一个全局唯一的标识符,具有高度的随机性和不可预测性。这使得攻击者无法猜测或生成有效的token。
  2. 一次性使用:服务器为每个用户会话生成一个唯一的CSRF token,并在每次敏感操作时验证。即使攻击者知道一个token,它也只在特定的用户会话中有效,不能重复使用。
  3. 独立于会话:CSRF token独立于用户的会话cookie,即使攻击者获得了会话cookie,也无法伪造CSRF token。

工作机制

  1. 生成Token:服务器在用户登录或访问敏感操作页面时,生成一个随机的UUID作为CSRF token,并将其嵌入到HTML表单或通过JavaScript添加到请求中。
  2. 提交Token:当用户提交表单或发送请求时,CSRF token作为请求参数或请求头的一部分发送到服务器。
  3. 验证Token:服务器接收到请求后,验证CSRF token是否有效。如果验证通过,则执行相应操作;否则拒绝请求。

例子

生成并验证CSRF token的示例:

生成Token(服务器端)

// 生成CSRF token
String csrfToken = UUID.randomUUID().toString();
session.setAttribute("csrfToken", csrfToken);

在表单中嵌入Token(客户端)

<form method="post" action="/submit">
  <input type="hidden" name="csrfToken" value="${csrfToken}">
  <!-- 其他表单字段 -->
  <button type="submit">Submit</button>
</form>

验证Token(服务器端)

// 从请求中获取CSRF token
String requestCsrfToken = request.getParameter("csrfToken");
String sessionCsrfToken = (String) session.getAttribute("csrfToken");

// 验证token
if (sessionCsrfToken == null || !sessionCsrfToken.equals(requestCsrfToken)) {
    throw new SecurityException("Invalid CSRF token");
}

通过这种方式,UUID作为CSRF token可以有效防范CSRF攻击,确保请求的合法性和安全性。

posted @ 2024-07-04 20:03  gongchengship  阅读(10)  评论(0编辑  收藏  举报