1. CSRF防御方案概述
在Web安全领域,CSRF(跨站请求伪造)攻击一直是最常见且危害性极大的安全威胁之一。作为一名从事Web开发多年的工程师,我见过太多因为CSRF防护不足而导致的安全事故——从用户账号被盗到资金被恶意转账,甚至整个系统被攻击者控制。这些惨痛教训让我深刻认识到,完善的CSRF防御机制不是可选项,而是每个Web应用的必备功能。
CSRF攻击之所以危险,在于它利用了Web最基础的运行机制:浏览器会自动携带用户的认证凭证(如Cookie)发起请求。攻击者不需要窃取用户密码,只需要诱骗用户点击一个恶意链接或访问一个精心构造的页面,就能以用户身份执行任意操作。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础防御:请求方法限制
2.1 防御原理与实现
GET请求由于其特性——参数直接暴露在URL中,可以被轻易伪造。想象一下,如果一个修改密码的接口使用GET方法,攻击者只需要构造一个包含新密码参数的URL,然后通过各种方式诱使用户访问这个URL,就能完成密码修改。
java复制// 不安全的GET请求示例
@GetMapping("/changePassword")
public String changePassword(@RequestParam String newPassword) {
// 修改密码逻辑
userService.updatePassword(newPassword);
return "密码修改成功";
}
正确的做法是将所有关键操作限制为POST请求:
java复制@PostMapping("/changePassword")
public String changePassword(@RequestParam String newPassword) {
// 修改密码逻辑
userService.updatePassword(newPassword);
return "密码修改成功";
}
// 显式禁止GET方法访问
@GetMapping("/changePassword")
public ResponseEntity<Void> forbidGetMethod() {
return ResponseEntity.status(HttpStatus.METHOD_NOT_ALLOWED).build();
}
2.2 实际应用中的注意事项
-
RESTful API设计:虽然RESTful风格建议使用合适的HTTP方法,但安全应优先于风格。即使用PUT/DELETE等方法,也要确保它们不会被CSRF攻击利用。
-
AJAX请求处理:现代前端框架通常默认使用POST方法,但仍需检查是否有遗漏的GET请求。
-
日志记录:对于尝试使用错误方法访问的请求,应该记录日志以便安全审计。
3. 核心防御:Token验证机制
3.1 Token验证的深层原理
Token验证之所以有效,是因为它引入了"同源策略"的保护。由于浏览器的同源策略限制,攻击者无法从目标网站获
