Apache Jmeter - CSRF 令牌不匹配
Posted
技术标签:
【中文标题】Apache Jmeter - CSRF 令牌不匹配【英文标题】:Apache Jmeter - The CSRF tokens do not match 【发布时间】:2017-09-01 06:29:39 【问题描述】:我已经用使用 csrf 令牌的 html 登录表单记录了基本的 Apache Jmeter 场景。
应用程序记录的示例令牌如下所示:
<input id="csrf_token" name="csrf_token" type="hidden" value="IjU5NzBhMmI3ODNjZGVjMGUwYmI2YTU4ZjRkMTk0MjI0MTg3OTJlNDAi.C8ecSA.PkvdB0aM2M0rfhSLcb_ktyeInfs">
使用 Apache Jmeter 后处理器 (REGEX) 我使用以下表达式提取值:
input id="csrf_token" name="csrf_token" type="hidden" value="(.+?)"
结果是成功的,并且值被分配给 CSRF_VALUE 变量。
在下一步中,我将带有登录信息的令牌发送到网站,发布数据如下所示:
username=username&password=password&csrf_token=IjU5NzBhMmI3ODNjZGVjMGUwYmI2YTU4ZjRkMTk0MjI0MTg3OTJlNDAi.C8ecSA.PkvdB0aM2M0rfhSLcb_ktyeInfs&submit=Zaloguj+si%C4%99
但是网站返回 csrf 令牌不匹配的错误。在记录的场景和修改的场景之间唯一改变的是在后续请求中提取和放置 csrf 令牌。每次我重播这个场景时,我都会检查结果,结果显示 csrf token received == csrf token sent。但是登录失败并出现同样的错误 - csrf 令牌不匹配。
到目前为止,我不知道出了什么问题,非常简单的场景,但还是有问题。我正在使用 apache jmeter 3.1。
【问题讨论】:
真的吗?从昨天开始,我就在处理同样的问题。 【参考方案1】:我建议检查请求正文以外的部分,即
您的应用程序可能希望 CSRF 令牌位于请求标头中,在这种情况下,您需要添加 HTTP Header Manager 以发送相关标头 您的应用程序可能需要一个带有 CSRF 令牌值的 Cookie。在这种情况下,您需要使用HTTP Cookie Manager 处理它 这可能是 HTML 编码和解码的问题,即提取的令牌值可能由于转义 HTML 中不允许的实体而包含一些额外的字符。在这种情况下,您将需要使用 JMeter Functions(如 __unescapeHtml())来规范化令牌值使用浏览器中的开发人员工具和 JMeter 的 View Results Tree 侦听器仔细检查请求和响应,很可能原因已在上面列出。
以防万一,请查看 How to Load Test CSRF-Protected Web Sites 指南。
【讨论】:
感谢您的提示,我已经有一段时间没有进行 http 测试了。我听从了你的建议,找到了缺失的部分。 那么缺少的部分是什么?以上是关于Apache Jmeter - CSRF 令牌不匹配的主要内容,如果未能解决你的问题,请参考以下文章
在Jmeter中获取CSRF令牌以进行salesforce负载测试
内部服务器错误 - CSRF 令牌已过期 - wsgi 错误文件 csrf.py 第 110 行 csrf 验证 SyntaxError: invalid syntax