Apache Jmeter - CSRF 令牌不匹配

Apache Jmeter - The CSRF tokens do not match

我已经使用 html 使用 csrf 令牌的登录表单记录了基本的 Apache Jmeter 场景。

应用程序记录的示例令牌如下所示:

<input id="csrf_token" name="csrf_token" type="hidden" value="IjU5NzBhMmI3ODNjZGVjMGUwYmI2YTU4ZjRkMTk0MjI0MTg3OTJlNDAi.C8ecSA.PkvdB0aM2M0rfhSLcb_ktyeInfs">

使用 Apache Jmeter Post 处理器 (REGEX) 我正在使用以下表达式提取值:

input id="csrf_token" name="csrf_token" type="hidden" value="(.+?)"

结果成功,值已分配给 CSRF_VALUE 变量。

在下一步中,我将带有登录信息的令牌发送到网站,post数据如下所示:

username=username&password=password&csrf_token=IjU5NzBhMmI3ODNjZGVjMGUwYmI2YTU4ZjRkMTk0MjI0MTg3OTJlNDAi.C8ecSA.PkvdB0aM2M0rfhSLcb_ktyeInfs&submit=Zaloguj+si%C4%99

但是网站 returns 错误 csrf 令牌不匹配。在记录的场景和修改之间唯一改变的是在后续请求中提取和放置 csrf 令牌。每次我重播这个场景时,我都会检查结果,它们显示 csrf 令牌已收到 == csrf 令牌已发送。但是登录失败并出现相同的错误 - csrf 令牌不匹配。

到目前为止,我无法理解哪里出了问题,非常简单的场景,但还是有问题。我正在使用 apache jmeter 3.1。

我建议检查请求 body 以外的部分,即

  • 您的应用程序可能希望 CSRF 令牌出现在请求 header 中,在这种情况下,您将需要添加 HTTP Header Manager 以发送相关的 header
  • 您的应用程序可能需要一个具有 CSRF 令牌值的 Cookie。在这种情况下,您需要使用 HTTP Cookie Manager
  • 来处理它
  • 这可能是 HTML 编码和解码的问题,即由于转义实体 HTML 不允许,提取的标记值可能有一些额外的字符。在这种情况下,您将需要使用 JMeter Functions like __unescapeHtml() 来规范化令牌值

使用浏览器中的开发人员工具和 JMeter 的 View Results Tree 侦听器仔细检查请求和响应,很可能是上面列出的原因。

以防万一,请查看 How to Load Test CSRF-Protected Web Sites 指南。