利用Jmeter测试CSRF令牌验证的Web API

简介: 事情的起因是最近收到的一批测试需求,要测试公司HR系统的接口性能。这个是需要测试的接口列表:所有的接口请求,都基于登录验证成功,否则将无法获得正确的应答。首先想到的是在浏览器上捕捉请求。打开Chrome浏览器,调出开发者工具栏,在地址栏输入登录模块的地址,访问登录页面: 输入账号和密码,录制登录过程;然后定位到开发工具的Network页面,找到登录的事务。

事情的起因是最近收到的一批测试需求,要测试公司HR系统的接口性能。这个是需要测试的接口列表:

所有的接口请求,都基于登录验证成功,否则将无法获得正确的应答。

首先想到的是在浏览器上捕捉请求。打开Chrome浏览器,调出开发者工具栏,在地址栏输入登录模块的地址,访问登录页面:

 

输入账号和密码,录制登录过程;然后定位到开发工具的Network页面,找到登录的事务。如下图:

注意右下方的Form Data,这是登录POST方法提交的三个参数,我们需要捕捉的就是_csrf的那个动态令牌。

通过在网上的一番查找和本地实验,成功的完成脚本的调试。

以下是整个过程:

 首先启动Jmeter UI,新建一个线程组;然后添加一个HTTP请求,取名UserLogin – Open,意在获得首次打开登录页面的CSRF Token。

 

方法使用GET,而实际的登录提交将为POST;这里并不是实际登录,不用在意。

这里一定要勾选【跟随重定向】,包括之后创建的HTTP请求,都勾选此选项。

请求参数部分,填写用户名和密码。由于现在还不能获取CSRF Token,此时登录并不会成功,但目的不在于登录,而在获得CSRF Token的内容。

 

完成后,创建一个【后置处理器 - 正则表达式提取器】,这里抽取登录页面响应报文中的CSRF Token。内容如下图:

 

Apply to选项:选中仅应用于主Sample。

这里需要注意的是“要检查的响应字段”,在网上查到的指导都是“消息头”,但在本人的测试中,从消息头中未能获取CSRF Token的信息;因此要设置在“主体”。

引用名称:可以随便写;

正则表达式:也就是希望提取的内容,格式需要从应答报文中去找。这里可以参考LoadRunner的关联的写法(左边际、右边际、正则表达式匹配的规则)。

实在没有头绪的朋友,可以从【察看结果树】的应答报文中找到,如下图:

 

模版:$1$,表示取第一次的值;也只有一个;

缺省值:随意,默认为空。

 

接下来,再创建一个HTTP请求,这次是实现真正的登录请求。

创建第二个HTTP请求,取名UserLogin – POST;因为登录的方法为POST,和前一个进行区分:

 

这次需要把登录提交的三个参数都填上,CSRF Token需要引用上一步从【正则表达式提取器中获取】的,写法是: ${token} 。

完成后,理论上我们就可以运行登录的脚本了;但是别急,还需要添加一个HTTP Cookie管理器。

我们先看看没有HTTP Cookie管理器的情况:

 

两处CSRF Token内容不一致,说明被当成两次不相关的访问。

再看看第二个HTTP请求提交的信息,此处的CSRF Token的内容已经和第一个应答报文一样了,说明我们前面的努力是正确的;可是为何还是没有登陆成功呢?

 

稍微想一想就能理解了,服务器端判断两次请求是否来自同一个客户端,不止一个CSRF Token,还有别的,比如会话ID。

我们翻回浏览器的开发者工具的页面看看:

 

Cookie中显然有三个参数,可以预料每次提交的请求,这三个参数都是动态取值;

而要保持会话过程中始终一致,我们需要在JMeter脚本里添加HTTP Cookie管理器:

 

添加以后也不需要设置什么项目,保持最初状态就够用了。

补充一下,为了确保HTTP Cookie管理器生效,需要修改jmeter\bin目录下的jmeter.properties。

找到选项CookieManager.save.cookies,将值修改为true,并删除句首的 # 号,让配置生效。

完成修改后,需要重启JMeter。

重启之后,我们再执行一次看看结果:

 

对比前一次的执行结果,UserLogin – POST的响应数据发生了变化,显示的标题是【我的工作台】,这是登录成功的重要标志;

而且两次HTTP请求获得的CSRF Token内容相同,登录操作完美成功。

后面就是添加其他业务API 的请求了,由于都是GET方式,很容易完成脚本的编写。

完成后,添加聚合报告和监控的Backend Listener就齐活了。

 

比如,我们查看一下这个用户的考勤记录:

 

执行一遍看看响应报文:

 

 

和期望的一样,登录之后,再访问其他功能的API 也能获得正确的应答。

脚本编写工作基本完成了。

相关文章
|
21小时前
|
JSON JavaScript 测试技术
掌握Postman,开启API测试新纪元!
Postman是一款流行的API测试工具和开发环境,旨在简化API开发过程、测试和文档编制。它提供了一套功能强大的工具,帮助开发人员更轻松地构建、测试和调试Web服务。
8 1
|
5天前
|
XML Web App开发 JavaScript
软件测试 -- Selenium常用API全面解答(java)
软件测试 -- Selenium常用API全面解答(java)
16 0
|
7天前
|
JSON 测试技术 API
pyhttptest 与 RESTful API 测试的完全指南
现在,无论是开发还是使用服务,我们每个人都面临着 REST API 的挑战。同时,我们正处于微服务的流行时代,我们将业务逻辑拆分为多个独立的小服务。这些服务大多遵循 RESTful 原则,并使用 JSON 格式进行通信,因为其简单性使其成为最广泛使用的格式。
|
12天前
|
安全 测试技术 API
API 渗透测试 4 个关键步骤
【5月更文挑战第17天】API渗透测试的四个关键步骤:信息收集、漏洞发现、漏洞利用和报告撰写。
|
14天前
|
算法 计算机视觉 异构计算
基于肤色模型的人脸识别FPGA实现,包含tb测试文件和MATLAB辅助验证
这是一个关于肤色检测算法的摘要:使用MATLAB 2022a和Vivado 2019.2进行测试和仿真,涉及图像预处理、RGB到YCbCr转换、肤色模型(基于阈值或概率)以及人脸检测。核心程序展示了如何读取图像数据并输入到FPGA处理,通过`tops`模块进行中值滤波、颜色空间转换及人脸检测,最终结果输出到"face.txt"。
|
14天前
|
Web App开发 JavaScript 测试技术
python自动化测试实战 —— WebDriver API的使用
python自动化测试实战 —— WebDriver API的使用
|
14天前
|
数据可视化 Java 测试技术
JMeter 如何实现 Elasticsearch 8.X 性能测试?
JMeter 如何实现 Elasticsearch 8.X 性能测试?
22 0
|
14天前
|
算法 异构计算
基于直方图的图像曝光量分析FPGA实现,包含tb测试文件和MATLAB辅助验证
该内容包括了算法的运行效果展示、软件版本信息、理论概述和核心程序代码。在正常图像中,`checkb`位于`f192b`和`f250b`之间,而多度曝光图像中`checkb`超出此范围,判断为曝光过度。使用的软件为Vivado 2019.2和MATLAB 2022a。理论依据未详细给出,但提及主要方法。提供的Verilog代码段用于处理图像数据,包括读取文件、时钟控制及图像histogram计算等,其中模块`im_hist`似乎是关键部分。
|
14天前
|
算法 TensorFlow 算法框架/工具
基于直方图的图像阈值计算和分割算法FPGA实现,包含tb测试文件和MATLAB辅助验证
这是一个关于图像处理的算法实现摘要,主要包括四部分:展示了四张算法运行的效果图;提到了使用的软件版本为VIVADO 2019.2和matlab 2022a;介绍了算法理论,即基于直方图的图像阈值分割,通过灰度直方图分布选取阈值来区分图像区域;并提供了部分Verilog代码,该代码读取图像数据,进行处理,并输出结果到"result.txt"以供MATLAB显示图像分割效果。
|
14天前
|
安全 前端开发 JavaScript
在Python Web开发过程中:Web框架相关,如何在Web应用中防止CSRF攻击?
在Python Web开发中防范CSRF攻击的关键措施包括:验证HTTP Referer字段、使用CSRF token、自定义HTTP头验证、利用Web框架的防护机制(如Django的`{% csrf_token %}`)、Ajax请求时添加token、设置安全会话cookie及教育用户提高安全意识。定期进行安全审计和测试以应对新威胁。组合运用这些方法能有效提升应用安全性。
22 0

热门文章

最新文章