zoukankan      html  css  js  c++  java
  • Python3+Selenium获取session和token供Requests使用教程

    Python3+Selenium获取session和token供Requests使用教程

    一、背景说明

    之前写了一款简单的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}
    "
              f"token为:     {token}")
    复制代码

    3.3 实现效果

    参考:

    https://pypi.org/project/selenium/

    http://www.runoob.com/jsref/prop-win-localstorage.html

    https://blog.csdn.net/sinat_34209942/article/details/81235925

    https://stackoverflow.com/questions/44102520/python-selenium-local-storage-returns-none

  • 相关阅读:
    Nmap参数详解(含扫描参数原理解释)
    为什么服务器突然回复RST——小心网络中的安全设备
    Security+学习笔记
    《HTTPS权威指南》读书笔记——PKI
    [Android 搞机]Twrp 中清除 data 和搞机清除的区别
    [C语言学习笔记五]复合语句和操作符的区分
    [C语言学习笔记四]变量与系统的交互
    [C语言学习笔记三]格式化输出和输入
    [C语言学习笔记二] extern 函数的用法
    [C语言学习笔记一]基本构架和变量
  • 原文地址:https://www.cnblogs.com/adolfmc/p/12639203.html
Copyright © 2011-2022 走看看