laravel 8中html表单需用post+@method('put')或@method('delete')伪造请求方法,配合@csrf防止csrf攻击;原始请求为post,经_method字段覆盖后被路由识别为put/delete,否则报405错误。

在Laravel 8中,HTML原生表单无法直接发送PUT或DELETE请求,但业务场景常需用PUT更新资源、DELETE删除资源——比如编辑用户资料页提交时走PUT路由,点击“删除账号”按钮触发DELETE路由。必须通过框架提供的方法伪造机制,让POST表单携带语义转换指令,才能被正确路由匹配和处理。
确认路由已正确定义
先确保routes/web.php中声明了对应HTTP动词的资源路由或显式路由:
使用资源路由最简洁:Route::resource('users', UserController::class); → 自动生成包含PUT/DELETE的7个标准路由。
若只需部分动作,可显式定义:Route::put('/users/{id}', [UserController::class, 'update']); 和 Route::delete('/users/{id}', [UserController::class, 'destroy']);。
【必须是POST表单提交才能触发_method解析】,否则即使写了_method=PUT,Laravel也会直接按原始GET/POST方法匹配路由,导致404或MethodNotAllowedHttpException。
在表单中注入伪造字段和CSRF令牌
方法一:Blade模板中使用@csrf + 手动添加_method
<form action="/users/123" method="POST"></form>
@csrf
<input type="hidden" name="_method" value="PUT">
<!-- 其他字段 -->
<button type="submit">更新用户</button>
方法二:使用@method辅助指令(更安全)
<form action="/users/123" method="POST"></form>
@csrf
@method('PUT')
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
这行会自动渲染为<input type="hidden" name="_method" value="PUT">,且值经htmlspecialchars转义,避免XSS注入风险。
方法三:DELETE表单同理,仅替换value值
<form action="/users/123" method="POST"></form>
@csrf
@method('DELETE')
<button type="submit" onclick="return confirm('确定要删除吗?')">删除用户</button>
验证伪造是否生效
第一步:在控制器方法中打印原始与最终请求方法
例如在UserController@update中加入:dd($_SERVER['REQUEST_METHOD'], $request->getMethod());
第二步:提交表单后观察输出
若第一项为POST(原始方法),第二项为PUT(伪造后方法),说明_method成功覆盖。
第三步:检查网络面板的Request Headers
查看Form Data区域是否存在_method: PUT字段;同时确认_token字段存在且非空——【缺少_token会导致419页面过期错误】。
第四步:对比route:list输出
运行php artisan route:list --method=PUT,确认目标路由确实在列表中且METHOD列为PUT,而非POST。










