Jmeter 登入使用了 jsencrypt 加密密碼的登入介面
在一次使用Jmeter做介面效能測試時,發現專案的登入介面,前端傳參時,對密碼進行了加密後傳參,使用密碼明文登入不了。當時想了兩個方案解決這個問題:
方案一:開啟瀏覽器,按下F12,使用一個使用者,輸入正確的祕密從介面登入,檢視登入介面傳入的密碼密文。然後在Jmeter中登入介面的password引數值設定為此密文。
不足:Jmeter啟動多個執行緒時,每個登入使用者的密碼需一樣
方案二:找前端開發詢問密碼加密的方式,然後在Jmeter上編寫js指令碼,按加密祕鑰加密密碼明文得到密文作為變數。然後登入介面引用變數。
當時由於時間緊迫,且週日,開發不在公司,採用了第一種方案。後面有時間,嘗試了第二種方案。以下記錄第二種方案的過程。
步驟1:首先找前端開發詢問了登入介面密碼加密的程式碼和引用的包jsencrypt.js檔案。然後將js檔案放到jmeter啟動jmeter.bat目錄下。前端程式碼如下
const getEncrypt = (data) => {
let publickKey = '公鑰字串'
let crypt = new JSEncrypt()
crypt.setPublicKey(publickKey)
return crypt.encrypt(data)
}
步驟2:開啟Jmeter,在登入介面下方新增JSR223 PreProcessor。編寫指令碼如下:
load("jsencrypt.js"); //載入js檔案
var publicKey = "公鑰字串"; //找開發要的公鑰祕鑰
var crypt = new JSEncrypt();
crypt.setPublicKey(publicKey);//設定公鑰祕鑰
log.info("${passwd}"); //passwd是通過csv獲取到的引數值,列印出密碼明文,用於除錯
var passwdEncryption = crypt.encrypt("${passwd}"); //對密碼明文進行加密
log.info(passwdEncryption); //列印出祕密加密後樣式
vars.put("passwdEncryption", passwdEncryption); //把加密後的放入全域性變數中,然後在登入介面引用${passwdEncryption}
Jmeter截圖如下
步驟3:執行Jmeter指令碼,檢視結果樹,發現登入失敗,提示賬號或密碼錯誤。開啟Jmeter的日誌,出現navigator is not defined in jsencrypt.js錯誤資訊。
因為jsencrypt.js檔案裡面使用到了navigator變數。這個變數在瀏覽器作為全域性變數存在,但在Jmeter上沒有,所以出現了未定義問題。
首先想的是Jmeter沒有,同時這個變數也用不到,所以就把jsencrypt.js中相關navigator的程式碼註釋掉,如下圖。再次執行Jmeter指令碼,報window也未定義,所以關於window程式碼也註釋掉。
navigator和window變數相關程式碼都註釋後,再執行Jmeter指令碼。報了其他問題JSEncrypt is not a function...。
步驟4:感覺註釋掉navigator和window變數行不通,就繼續在網上尋找資料,發現通過在Jmeter中新增var window = this; var navigator = this;
定義window和navigator變數。不用修改js檔案,能實現密碼加密和登入成功。
在 JavaScript 中 this 不是固定不變的,它會隨著執行環境的改變而改變。單獨使用 this,會指向全域性(Global)物件。我理解的是會獲取jmeter環境下的全域性物件。最終指令碼如下
var window = this; //定義window全域性變數
var navigator = this; //定義navigator全域性變數
load("jsencrypt.js"); //載入js檔案
var publicKey = "公鑰字串"; //找開發要的公鑰祕鑰
var crypt = new JSEncrypt();
crypt.setPublicKey(publicKey);//設定公鑰祕鑰
log.info("${passwd}"); //passwd是通過csv獲取到的引數值,列印出密碼明文,用於除錯
var passwdEncryption = crypt.encrypt("${passwd}"); //對密碼明文進行加密
log.info(passwdEncryption); //列印出密碼加密後樣式
vars.put("passwdEncryption", passwdEncryption); //把加密後的放入Jmeter全域性變數中,然後在登入介面引用${passwdEncryption}
附錄:
在指令碼log.info("${passwd}"); var passwdEncryption = crypt.encrypt("${passwd}");
中passwd是通過csv獲取到的引數值,需要加上雙引號,使引數值變為字串型別,不然因為特殊字元(@)會報如下錯誤。
或者沒有特殊字元(@),也會出現引用未定義
相關文章
- jmeter介面自動化:登入到新增JMeter
- elasticsearch加賬號密碼登入Elasticsearch密碼
- 賬號密碼登入介面密碼
- 掃碼登入是這樣登入的
- uniapp 完成兩種方式登入 驗證碼登入 密碼登入APP密碼
- jmeter通過cookies來登入JMeterCookie
- 登入介面完成(十五)
- 登入介面居中效果
- 登入介面(C#)C#
- 【網頁登入】QQ 登入、微信登入、微博登入、GitHub 登入網頁Github
- 登入過期--localStorage加sessionStorage實現7天登入過期Session
- 織夢後臺登入成功又跳轉回登入介面與驗證碼
- WPF登入介面樣例
- 密碼登入密碼
- Luffy /4/ 多方式登入介面&登入註冊前端頁面前端
- 直播app系統原始碼,簡單的登入介面(登入、註冊、記住密碼等按鍵)APP原始碼密碼
- Sitespeed.io 如何進入登入後的介面
- 如何關閉win10登入介面_win10取消登入介面的方法Win10
- ubuntu登入時出現“一閃之後回到登入介面”的現象Ubuntu
- unbuntu16.04 伺服器的 免密登入、秘鑰登入和禁止密碼登入 配置伺服器密碼
- unbuntu16.04 伺服器的 免密登入、祕鑰登入和禁止密碼登入 配置伺服器密碼
- 聊聊“密碼登入”、“手機快捷登入”和“第三方聯合登入”密碼
- win10 登入介面的使用者怎麼隱藏_如何在win10登入介面登入隱藏帳戶Win10
- Python——奇怪的掃碼登入Python
- 如何關閉win10登入介面_win10不顯示登入介面的方法Win10
- win10系統登入介面如何變成命令提示符登入介面Win10
- 您的登入IP不在管理員配置的登入掩碼範圍內
- FTP登入時一直彈出登入視窗,就算輸入正確的賬號密碼也不能登入FTP密碼
- MFC 之使用者登入介面
- ubuntu密碼正確,卻不能登入圖形介面Ubuntu密碼
- 修改 MySQL 登入密碼MySql密碼
- 密碼方式登入redis密碼Redis
- 微信掃碼登入
- SSMS18 登陸介面清除不需要的登入賬戶SSM
- 遊戲陪玩原始碼的登入方式,簡訊驗證碼登入的實現遊戲原始碼
- 使用 JWT 構建基本的 Api 登入介面JWTAPI
- [API 寫法] QQ 登入、微信登入、Facebook、google、蘋果登入APIGo蘋果
- python+pytest介面自動化(9)-cookie繞過登入(保持登入狀態)PythonCookie