使用JMeter对Laravel网站认证时遭遇419错误求助
解决JMeter测试Laravel多用户登录时的419 CSRF验证错误
核心原因
Laravel返回419错误是CSRF验证失败,意味着请求未提供有效CSRF令牌,或令牌与当前用户Session不匹配。你之前仅提取令牌到请求头的操作,忽略了Session与令牌的绑定关系,这是问题核心。
具体解决方案
1. 配置HTTP Cookie管理器
必须在测试计划最顶层添加HTTP Cookie管理器,且确认勾选「每个线程独立配置」选项(默认已勾选)。Laravel的CSRF验证依赖Session,Cookie管理器会自动为每个模拟用户(线程)保存独立的laravel_session和XSRF-TOKEN Cookie,这是令牌验证的基础。
2. 正确提取并使用XSRF-TOKEN
Laravel将CSRF令牌存储在XSRF-TOKEN Cookie中,请求时需将该Cookie值解码后放入X-XSRF-TOKEN请求头:
- 在登录页的GET请求(或任何返回Cookie的前置请求)下添加正则表达式提取器,配置如下:
- 引用名称:
xsrf_token - 正则表达式:
XSRF-TOKEN=(.+?); - 模板:
$1$
- 引用名称:
- 在POST登录请求的HTTP信息头管理器中添加字段:
- 名称:
X-XSRF-TOKEN - 值:
${__urlDecode(${xsrf_token},)}
注:
__urlDecode函数必须添加,因为Cookie中的令牌是URL编码状态,直接使用会导致验证失败。 - 名称:
3. 匹配实际网站的请求规则
对照浏览器开发者工具(F12),确保JMeter登录请求与真实请求完全一致:
- 请求方法必须为POST
- 参数名称(如
email/password)要和Laravel登录表单的name属性完全匹配 - 内容类型设置为
application/x-www-form-urlencoded(与真实表单提交一致) - 补充必要请求头(如
Accept、Referer,部分Laravel配置会校验Referer来源)
4. 临时测试方案(仅用于验证流程,禁止生产环境使用)
若仅需验证负载测试流程,可临时在Laravel的app/Http/Middleware/VerifyCsrfToken.php中将登录路由加入CSRF例外:
protected $except = [ '/login', ];
警告:生产环境绝对不能使用此方法,会引发CSRF安全风险。
5. 确保线程隔离
多用户测试时,要保证每个线程的Cookie和Session完全独立:
- 确认HTTP Cookie管理器的「每个线程独立配置」已勾选
- 禁止使用全局变量传递令牌或Session信息
排查验证步骤
- 用JMeter「查看结果树」查看每个请求的Cookie,确认
XSRF-TOKEN和laravel_session存在且每个线程值不同 - 检查POST登录请求的请求头,确认
X-XSRF-TOKEN是解码后的正确令牌 - 对比浏览器发送的登录请求,校验JMeter的参数、头信息是否完全一致
内容的提问来源于stack exchange,提问作者MAHAMADOU DEMBELE
相关产品推荐
相关产品推荐

