
本文详解在 Web 开发中安全处理 RESTful 的 PUT/DELETE 请求的方法,涵盖 CSRF 防护、资源所有权校验、HTTP 方法合理性及现代实践(如使用 POST + _method 或专用端点),避免因误触发或越权操作导致数据泄露或丢失。
本文详解在 web 开发中安全处理 restful 的 put/delete 请求的方法,涵盖 csrf 防护、资源所有权校验、http 方法合理性及现代实践(如使用 post + `_method` 或专用端点),避免因误触发或越权操作导致数据泄露或丢失。
在构建 RESTful 后端 API(例如 /notes 资源)时,仅依赖 CORS 或简单身份认证远不足以保障 PUT(更新)和 DELETE(删除)等非幂等、高危操作的安全性。真正的安全需从协议层、会话层、业务逻辑层三重防护入手。
✅ 1. 拒绝将敏感操作暴露在 GET 中(杜绝 URL 触发)
如问题中所示,/notes?action=delete¬e_id=7 是严重反模式:它允许通过链接、图片标签、预加载等方式被意外或恶意触发(即 GET 可被缓存、记录、传播)。HTTP 规范明确要求:GET 必须是安全的(safe)且幂等的(idempotent),不得引发状态变更。
✅ 正确做法:所有修改类操作必须使用 POST、PUT、DELETE 等非安全方法,并通过服务端严格校验请求方法:
// 示例:PHP 中强制限定方法
if ($_SERVER['REQUEST_METHOD'] !== 'DELETE') {
http_response_code(405);
exit('Method Not Allowed');
}✅ 2. 强制资源所有权校验(核心防线)
即使请求方法正确、用户已登录,也必须验证当前操作的资源(如笔记)是否真正属于该用户。这是防止水平越权(Horizontal Privilege Escalation) 的关键步骤:
// 安全删除示例(PHP + PDO)
$noteId = (int)($_GET['note_id'] ?? 0);
if ($noteId <= 0) {
http_response_code(400);
exit('Invalid note ID');
}
// 查询笔记并关联用户 ID
$stmt = $pdo->prepare("SELECT id, user_id FROM notes WHERE id = ?");
$stmt->execute([$noteId]);
$note = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$note || $note['user_id'] !== $_SESSION['user_id']) {
http_response_code(403);
exit('Forbidden: You do not own this note');
}
// 执行删除(推荐软删除或事务化)
$pdo->prepare("DELETE FROM notes WHERE id = ?")->execute([$noteId]);⚠️ 注意:永远不要仅依赖客户端传入的
user_id;必须通过数据库关联查询确认归属关系。
✅ 3. 抵御 CSRF 攻击(防止伪造请求)
即使使用 DELETE 方法,若缺乏 CSRF 防护,攻击者仍可诱导用户点击恶意表单或提交跨域 <form method="DELETE"></form>(现代浏览器支持,但需配合 Content-Type: application/json 等 header 才可能绕过简单检查)。
✅ 推荐方案:
-
CSRF Token(服务端生成 + 前端携带):在每个敏感请求头(如
X-CSRF-Token)或请求体中携带一次性 token; -
SameSite Cookie 属性:设置
Set-Cookie: session=xxx; SameSite=Lax(或Strict),有效缓解第三方站点发起的 Cookie 携带型攻击; - 双重 Cookie 提交(Double Submit Cookie):前端读取 cookie 中的 token 并放入请求 header,服务端比对。
✅ 4. 实用建议:REST 兼容性与现实约束
- 浏览器原生表单不支持
PUT/DELETE方法提交(仅GET/POST),因此常见做法是:- 使用
POST+ 隐藏字段_method=DELETE,由后端中间件重写为对应动作(Laravel、Symfony 等框架内置支持); - 或统一采用 JSON API,前端用
fetch()显式指定method: 'DELETE',并设置Content-Type: application/json。
- 使用
- 对于纯 API 服务(如移动端、SPA),应启用完整 HTTP 方法,并配合
Access-Control-Allow-Methods: GET, POST, PUT, DELETE及严格的Access-Control-Allow-Origin白名单。
✅ 总结:安全四原则
| 层级 | 关键措施 |
|---|---|
| 协议层 | 禁用 GET 修改;强制使用 PUT/DELETE;拒绝未授权方法 |
| 认证层 | 验证用户登录态(如 JWT / Session)且未过期 |
| 授权层 |
100% 校验资源所有权(note.user_id === current_user.id) |
| 防护层 | 添加 CSRF Token / SameSite Cookie / 请求签名(如 HMAC) |
安全不是“加个 hash”或“多传个 ID”就能解决的——它是分层防御的结果。每一次 DELETE 请求,都应是一次「身份确认 + 权限核验 + 意图验证」的完整闭环。

















