跨域请求伪造攻击(Cross-Site Request Forgery,简称CSRF)是一种恶意攻击,其中攻击者诱使用户在已认证的会话中执行未授权的操作。通过在受害者访问的站点中嵌入恶意请求,攻击者可以利用用户的身份来执行一些用户未授权的操作,如转账、修改资料等。
跨域请求伪造攻击(CSRF)
攻击原理
- 用户登录认证网站A:用户在浏览器中登录了一个网站A(例如银行网站),并生成了一个有效的会话cookie。
- 用户访问恶意网站B:在登录网站A后,用户无意间访问了另一个恶意网站B。
- 恶意请求:恶意网站B包含一个恶意脚本,该脚本通过自动提交表单或发送请求,向网站A发送请求。由于用户已经在网站A登录,浏览器会自动附带用户的会话cookie。
- 服务器接受请求:网站A收到请求并认为是用户合法操作,因为请求附带了有效的会话cookie。
解决CSRF的常用方法
- CSRF Token:在每个敏感操作的请求中包含一个唯一的、不可预测的token。服务器生成并验证这个token,确保请求是由合法用户发起的。
- SameSite Cookie 属性:通过设置cookie的
SameSite
属性,限制跨站点请求中cookie的发送。例如,设置为Strict
或Lax
。 - Referer和Origin检查:服务器检查请求头中的
Referer
或Origin
字段,确保请求来源于可信任的站点。
浏览器在防范CSRF方面的努力
浏览器通过多种方式帮助防范CSRF攻击:
- SameSite Cookie 属性:浏览器支持
SameSite
属性,可以设置cookie只在同站点请求中发送。例如:Set-Cookie: sessionid=abc123; SameSite=Strict
- CORS(跨域资源共享):浏览器实现了严格的跨域请求策略(CORS),默认情况下,浏览器不会允许跨域的资源请求,除非服务器明确允许。
为什么随机UUID做token可以解决CSRF攻击
随机UUID作为CSRF Token的优势
- 不可预测性:UUID是一个全局唯一的标识符,具有高度的随机性和不可预测性。这使得攻击者无法猜测或生成有效的token。
- 一次性使用:服务器为每个用户会话生成一个唯一的CSRF token,并在每次敏感操作时验证。即使攻击者知道一个token,它也只在特定的用户会话中有效,不能重复使用。
- 独立于会话:CSRF token独立于用户的会话cookie,即使攻击者获得了会话cookie,也无法伪造CSRF token。
工作机制
- 生成Token:服务器在用户登录或访问敏感操作页面时,生成一个随机的UUID作为CSRF token,并将其嵌入到HTML表单或通过JavaScript添加到请求中。
- 提交Token:当用户提交表单或发送请求时,CSRF token作为请求参数或请求头的一部分发送到服务器。
- 验证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攻击,确保请求的合法性和安全性。
标签:浏览器,跨域,攻击,用户,token,CSRF,请求 From: https://www.cnblogs.com/gongchengship/p/18284581