CSRF攻击通过伪造用户请求执行非授权操作,防御核心是验证请求来源。主要策略包括:同步令牌模式(STP),在表单中嵌入服务器生成的随机令牌并验证;双重提交Cookie,将令牌同时存于Cookie和请求参数并比对;SameSite Cookie,设置Cookie的SameSite属性为Strict或Lax以限制跨站发送;Referer和Origin检查,验证请求来源域名,但前者易被篡改或缺失,后者更可靠但兼容性有限。其中STP最常用且安全,适合高安全需求场景;双重提交Cookie开发成本低但需防XSS;SameSite简单有效但依赖浏览器支持。建议结合多种方法提升防护能力。

CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种网络攻击,攻击者诱使用户在已登录的网站上执行非用户本意的操作。避免CSRF攻击的关键在于验证请求的来源,确保请求确实来自用户的合法操作。
解决方案:
CSRF攻击的本质是利用用户在已认证网站的信任关系,冒充用户发起请求。防御CSRF主要有以下几种策略:
同步令牌(Synchronizer Token Pattern,STP): 这是最常见的防御方法。服务器在用户访问页面时生成一个随机的、唯一的CSRF令牌,并将它嵌入到表单或链接中。当用户提交表单或点击链接时,浏览器会将这个令牌一起发送给服务器。服务器验证令牌是否与用户会话中存储的令牌匹配。如果匹配,则认为请求是合法的;否则,拒绝请求。
实现细节:
UUID.randomUUID().toString()
代码示例 (Java):
// 生成 CSRF 令牌
String csrfToken = UUID.randomUUID().toString();
request.getSession().setAttribute("csrfToken", csrfToken);
// 在表单中添加 CSRF 令牌
out.println("<input type='hidden' name='csrfToken' value='" + csrfToken + "'>");
// 验证 CSRF 令牌
String sessionToken = (String) request.getSession().getAttribute("csrfToken");
String requestToken = request.getParameter("csrfToken");
if (sessionToken != null && sessionToken.equals(requestToken)) {
// 处理请求
} else {
// 拒绝请求
}双重提交 Cookie(Double Submit Cookie): 服务器不存储CSRF令牌,而是将令牌同时设置在Cookie和请求参数中。服务器验证Cookie中的令牌和请求参数中的令牌是否一致。因为只有来自同一域的脚本才能读取Cookie,所以可以防止跨域攻击。
实现细节:
代码示例 (JavaScript & Server-side):
// JavaScript (设置 Cookie)
function setCookie(name, value, days) {
// ... (Cookie 设置逻辑)
}
let csrfToken = generateRandomToken(); // 假设有这个函数生成随机令牌
setCookie('csrfToken', csrfToken, 7); // 设置 7 天过期
document.getElementById('csrf_token').value = csrfToken; // 设置隐藏字段// Java (验证 Cookie)
Cookie[] cookies = request.getCookies();
String cookieToken = null;
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("csrfToken")) {
cookieToken = cookie.getValue();
break;
}
}
}
String requestToken = request.getParameter("csrfToken");
if (cookieToken != null && cookieToken.equals(requestToken)) {
// 处理请求
} else {
// 拒绝请求
}Referer 检查: 检查HTTP请求头中的
Referer
Referer
Referer
SameSite Cookie: 设置Cookie的
SameSite
Strict
Lax
Strict
Lax
优点: 简单易用,可以有效地防御CSRF攻击。
缺点: 需要浏览器支持,旧版本的浏览器可能不支持
SameSite
代码示例 (Java):
Cookie csrfCookie = new Cookie("csrfToken", csrfToken);
csrfCookie.setHttpOnly(true);
csrfCookie.setSecure(true); // 建议在 HTTPS 环境下使用
csrfCookie.setPath("/");
csrfCookie.setSameSite("Strict"); // 或者 "Lax"
response.addCookie(csrfCookie);Origin 检查: 检查HTTP请求头中的
Origin
Origin
Referer
Origin
Origin
Origin
Referer
Referer
Referer
Referer
Referer
Referer
Referer
Referer
Referer
Referer
Referer
<a>
rel="noreferrer"
Referer
Referer
Referer
example.com
evil.example.com
evil.example.com
因此,
Referer
SameSite
选择合适的 CSRF 防御策略需要综合考虑以下因素:
SameSite
一般来说,同步令牌(STP)是最常用的 CSRF 防御策略。如果对浏览器兼容性有较高要求,或者开发成本有限,可以考虑使用双重提交 Cookie。
SameSite
最终选择哪种策略,需要根据具体的应用场景和需求进行权衡。建议采用多种防御手段相结合的方式,以提高 CSRF 防御的安全性。
以上就是什么是 CSRF攻击,如何避免?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号