一、背景说明
之前写了一款简单的api模糊测试工具,之前系统可以使用http Base认证现在改成session形式并加上了token。
最简单的改造方法,是自己先在浏览器手动登录,然后提取出session和token(系统token在整个会话期间可重复使用)填到模糊测试工具中即可。但这种非全自动化的方式不到万不得已不想用。
最直接的方法,最使用requests按登录流程依次发包登录即可。但其中的难点是密码是加密提交的,询问开发人员说是DES加密;DES加密不难,但是用不同的语言编写的加密算法与别人的结果完全一致那就比较费工夫。
最后的方法,那就是使用selenium登录避开密码的构造,这种方法的关键点在于:selenium是基于图形界面操作的,没有直接的办法能获取request和response的数据包,在这种情况下如何获取session和token。
自己动web前端的存储并没有很深入了解,一直想的是如何获取selenium request和response的数据包从中提取session和token,直到看到这篇文章才想起前端的变量(尤其是restful中的全局变量)会放存localStorage和sessionStorage中,从中提取session和token即可。
二、环境搭建
2.1 下载驱动
下载驱动文件,放到后续python文件同级目录下或加入到环境变量中即可。其中Chrome驱动要注意Driver版本与浏览器版本对应要求。
Firefox驱动下载地址:https://github.com/mozilla/geckodriver/releases
Chrome驱动下载地址:http://chromedriver.chromium.org/downloads
Safari驱动下载地址:https://webkit.org/blog/6900/webdriver-support-in-safari-10/
Edge驱动下载地址:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
2.2 安装selenium
pip install selenium
三、程序实现
3.1 系统状况
手动登录系统后,查看存储状况如下图所示,sessionid和token分别存储在sessionStorage的sessionId和token两个变量中
3.2 实现代码
import json import time from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By class GetSessionAndToken(): def __init__(self): # 启用无头模式,可选 browser_options = webdriver.FirefoxOptions() browser_options.add_argument('--headless') browser_options.add_argument('--disable-gpu') self.browser = webdriver.Firefox(firefox_options=browser_options) # self.browser = webdriver.Chrome() # 登录系统,具体到自己系统时需要自行修改 def login_system(self): # 登录用户名密码,改成目标系统用户名密码 username = "admin" password = "123456" # 登录页面url,改成目标系统登录页面 url = "https://10.10.6.93/#login" self.browser.get(url) # 显性等待,直到用户名控件加载出来才进行下一步 WebDriverWait(self.browser,20,0.5).until(EC.presence_of_element_located((By.ID,"txtUserName"))) # 填写用户名 self.browser.find_element_by_id("txtUserName").send_keys(username) # 填写密码 self.browser.find_element_by_id("txtPassword").send_keys(password) # 点击登录 self.browser.find_element_by_id("btnLogin").click() # 强制等待5秒,待session和token都成功返回并存到浏览器中 # restful隐性等待不太好用?self.browser.implicitly_wait(5) time.sleep(5) # 获取sessionid def get_sessionid(self): # 是要从localStorage中获取还是要从sessionStorage中获取,具体看目标系统存到哪个中 # window.sessionStorage和直接写sessionStorage是等效的 # 一定要使用return,不然获取到的一直是None # get的Item不一定就叫sessionId,得具体看目标系统把sessionid存到哪个变量中 sessionid = self.browser.execute_script('return sessionStorage.getItem("sessionId");') # 另外sessionid一般都直接通过返回Set-Cookies头设置到Cookie中,所以也可以从Cookie读取 # 获取浏览器所有Set-Cookie,返回对象是字典列表 # cookies = self.browser.get_cookies() # 获取单项Cookie,是不是叫sessionId取决于系统存成什么变量,单项Cookie是字典 # cookie = self.browser.get_cookie("sessionId") # cookie = cookie["value"] # print(f"{cookies}") return sessionid # 获取token def get_token(self): # 是要从localStorage中获取还是要从sessionStorage中获取,具体看目标系统存到哪个中 # window.sessionStorage和直接写sessionStorage是等效的 # 一定要使用return,不然获取到的一直是None # get的Item不一定就叫token,得具体看目标系统把token存到哪个变量中 token = self.browser.execute_script('return sessionStorage.getItem("token");') # print(f"{token}") return token def __del__(self): # 退出程序时关闭浏览器 self.browser.close() if __name__ == "__main__": obj = GetSessionAndToken() obj.login_system() sessionid = obj.get_sessionid() token = obj.get_token() print(f"sessionid为: {sessionid}\n" f"token为: {token}")
3.3 实现效果
更多关于Python获取session和token方法请查看下面的相关链接
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新动态
- 雨林唱片《赏》新曲+精选集SACD版[ISO][2.3G]
- 罗大佑与OK男女合唱团.1995-再会吧!素兰【音乐工厂】【WAV+CUE】
- 草蜢.1993-宝贝对不起(国)【宝丽金】【WAV+CUE】
- 杨培安.2009-抒·情(EP)【擎天娱乐】【WAV+CUE】
- 周慧敏《EndlessDream》[WAV+CUE]
- 彭芳《纯色角3》2007[WAV+CUE]
- 江志丰2008-今生为你[豪记][WAV+CUE]
- 罗大佑1994《恋曲2000》音乐工厂[WAV+CUE][1G]
- 群星《一首歌一个故事》赵英俊某些作品重唱企划[FLAC分轨][1G]
- 群星《网易云英文歌曲播放量TOP100》[MP3][1G]
- 方大同.2024-梦想家TheDreamer【赋音乐】【FLAC分轨】
- 李慧珍.2007-爱死了【华谊兄弟】【WAV+CUE】
- 王大文.2019-国际太空站【环球】【FLAC分轨】
- 群星《2022超好听的十倍音质网络歌曲(163)》U盘音乐[WAV分轨][1.1G]
- 童丽《啼笑姻缘》头版限量编号24K金碟[低速原抓WAV+CUE][1.1G]