Python安全开发之第三方库requests讲解【C10课】

admin 2021年12月15日03:18:56评论114 views字数 7035阅读23分27秒阅读模式

Python安全开发之第三方库requests讲解【C10课】

  



           



1
课程目标


  1. 掌握安装第三方模块的方法

  2. 掌握requests库的常用方法与返回值

  3. 掌握requests下载保存数据


如time,socket,os这些库都是系统自带的,第三方库是其他程序员编写与维护的库,系统没有自带,需要下载安装他们调用方法也是使用import调用的。

系统库与第三方库的唯一区别就是:一个是默认自带不需要下载安装的库,一个是需要下载安装的库。

requests库是网络请求库,非常的简单使用,常用于爬虫,文件下载,漏洞验证等许多业务区。



2
核心知识



2-1


     安装第三方模块

安装python后会默认安装pip,pip是下载与安装第三方模块的工具。

使用方法如下:

1python3 -m pip install 第三方库的名字

举个例子,以安装requests库

1python3 -m pip install requests



2-2


    GET/POST区别

GET和POST是HTTP请求的两种基本方法,通俗简单的理解,就是你打开一个网页的时候使用get请求,登陆账号密码的时候使用post请求。即get是从服务器上获取数据,post是向服务器传送数据,还有就是get请求方式你可以在浏览器看到请求的网址和数据,post请求方式则无法在浏览器网址栏看到。

具体查看网址的请求方式,可以在浏览器种F12查看网络流量即可看到。



2-3


    HTTP请求方式

除了get,post,还有head,delete,options请求方式。他们的用法如出一辙

1import requests
2r = requests.post('http://www.langzi.fun/admin.php', data = {'user':'langzi'})
3# post 请求
4r = requests.put('http://www.langzi.fun', data = {'user':'langzi'})
5# put 请求
6r = requests.delete('http://www.langzi.fun/delete')
7r = requests.head('http://www.langzi.fun/index.html')
8r = requests.options('http://www.langzi.fun/get')

介绍最常见是三种方式以及用途:

1get-->请求数据-->发起请求,获取完整的数据,速度慢-->获取网页的内容,爬虫,poc编写
2psot-->发送数据-->主动服务器提交数据,返回获取完整的数据-->提交数据,获取网页返回的结果,爬虫,poc编写
3head-->头请求-->很少网络流量获得概要信息,获取请求头,状态码,速度极快-->敏感目录扫描




2-4


    状态码

200 ---> 请求成功,网页内容存在

301/302 ---> 自动跳转到其他网页

400/401/404 ---> 网页内容不存在



2-5


    head请求方式

head请求方式也叫头请求,它使用很少网络流量获得概要信息。比如获取请求头信息,状态码信息,速度极快。一般用在网页是否存在检测,或者粗略的信息获取上。

 1import requests
2r = requests.head(url='http://langzi.fun/')
3# 请求的网页的内容,自动编码,但是有几率会乱码,不建议使用
4print(r.url)
5# 请求的网址,字符串类型
6print(r.headers)
7# 请求头,字典类型
8print(r.status_code)
9# 状态吗,整数类型
10print(r.encoding)
11# 网页的编码,字符串类型
12print(r.cookies)
13# 保存的cookie

运行结果>>>

1http://langzi.fun/
2{'Server''nginx/1.15.11''Date''Wed, 01 Jan 2020 05:29:19 GMT''Content-Type''text/html''Content-Length''64868''Last-Modified''Tue, 17 Dec 2019 13:13:57 GMT''Connection''keep-alive''ETag''"5df8d495-fd64"''Accept-Ranges''bytes'}
3200
4ISO-8859-1
5<RequestsCookieJar[]>




2-6


    get请求方式

get请求方式,发起请求,获取完整的数据,速度慢。但是能获取网页的完整内容,还能获取请求头信息,获取状态码信息等等。常用在网页数据抓取,网页数据内容分析上,比如爬虫,漏洞验证等。

1import requests
2r = requests.get(url='http://langzi.fun/')
3# 定义一个变量r,使用get方式请求网址
4print(r.content)
5# 打印出网页的内容--bytes格式

如上就是发起对网页的一次请求,并且打印出网页的内容。

发起请求除了能获取网页的内容,还能获取如下的数据

 1print(r.text)
2# 请求的网页的内容,自动编码,但是有几率会乱码,不建议使用
3print(r.content)
4# 请求的网页的内容--bytes格式,如果要转中文字符串,需要调用decode()方法
5print(r.content.decode('utf-8'))
6# 请求的网页的内容--字符串格式,自动转换成中文,不同网站编码不同
7print(r.url)
8# 请求的网址,字符串类型
9print(r.headers)
10# 请求头,字典类型
11print(r.status_code)
12# 状态码,整数类型
13print(r.encoding)
14# 网页的编码,字符串类型
15print(r.cookies)
16# 保存的cookie

requests支持url参数格式化,比如网址为:

1http://www.langzi.fun/ge?key2=value2&key1=value1

使用params方便对网址参数进行维护

1payload = {'key1''value1''key2''value2'}
2r = requests.get("http://langzi.fun/ge", params=payload)
3# 这里的网址自动转变成了 http://www.langzi.fun/ge?key2=value2&key1=value1


2-7


   post请求方式

post请求方式,能主动发送数据,主动服务器提交数据,返回获取完整的数据。一般在用户登录,点击按钮等位置用,可以主动提交数据,获取网页返回的结果,常用于爬虫,漏洞验证编写上,和get方式获取的结果是差不多的,不过请求方式不一样。

发送到数据需要保存为字典格式:

1d = {'user':'admin','password':'123456'}
2r = requests.post(url='http://www.langzi.fun/admin.php',data=d)

还可以上传文件,格式也需要是字典格式

1files = {'file': open('report.xls''rb')}
2r = requests.post(url='http://www.langzi.fun/upload', files=files)

如果上传极大的文件,需要使用requests toolbelt 参考文档(https://toolbelt.readthedocs.io/en/latest/)

2-8


    其他参数设置

设置超时

当访问一个网址,希望如果10秒钟后还没有回应,就直接报错,使用timeout参数即可实现

1r = requests.get(url='http://langzi.fun/',timeout=10)

设置请求头

requests是一个网络请求库,但是许多网站会检测你发起过来的请求是否使用浏览器打开,这个时候就需要加上请求头伪装成浏览器

1headersssssss = {'User-Agent':'ozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'}
2r = requests.get(url='http://langzi.fun/',timeout=10,headers=headersssssss)

除了浏览器请求头,还可以加上网址的cookie等信息,避免对方网址的反爬虫发现。

不检测https证书

requests会对https网址验证ssl证书,如果证书验证失败,则会抛出异常,关闭方法如下:

1requests.packages.urllib3.disable_warnings()
2r = requests.get(url='http://langzi.fun/',timeout=10,verify=False)

禁止网页重定向

默认情况下,requests 会自动处理所有重定向,可以通过参数设置禁止重定向

1r = requests.get(url='http://langzi.fun/',timeout=10,verify=False,allow_redirects=False)

保存数据

保存网页的内容

1r = requests.get('http://www.langzi.fun')
2con = r.content.decode('utf-8')
3with open('浪子博客首页.txt','a+',encoding='utf-8')as a:
4    a.write(con)

保存图片数据

1import requests
2r = requests.get('http://www.langzi.fun/upload/my_girl.jpg')
3with open('第一张图片.jpg','wb')as a:
4    a.write(r.content)

保存视频数据

1import requests
2r = requests.get('http://www.langzi.fun/upload/xxoo.mp4',stream=True)
3for it in r.iter_content():
4    with open('一段视频.mp4','wb')as a:
5        a.write(it)

其他的保存压缩包/音频等文件方式与下载视频方式一样,需要注意保存文件的后缀即可。


3
应用场景


  1. 暴力破解、撞库、爬虫等场景下使用

  2. 模拟网站的登陆,查看,下载数据

  3. POC/EXP的编写,漏洞扫描器网络请求



4
总结归纳


  1. 掌握requests最常用的三种请求方式:head/get/post

  2. 掌握requests参数的设置

  3. 掌握requests返回值

  4. 掌握requests如何保存数据


5
拓展知识


安装 pip

安装python.msi时候没有勾选安装pip的情况下,就不会帮你安装pip的,在cmd下输入命令安装

1python3 -m pip install -U pip setuptools

如果报错的话,到Python pip(https://pip.pypa.io/en/stable/installing/)网站下载get-pip.py 文件,python3 get-pip.py安装即可。

如果你安装的时候勾选了pip,但是目录下并没有pip,可以通过命令调出pip

1python3 -m ensurepip

然后会发现目录下生成了pip文件

在linux系统的python3环境中,你发现怎么样折腾安装不上pip3,各种报错显示:

1No module named pip

这个时候使用apt-get安装即可

1apt-get install python3-pip
2pip3 -v

离线安装第三方库

  1. 在pypi(https://pypi.org/project/)官方搜索你需要的库的名字

  2. 找到文件压缩包,下载后并解压,压缩包的格式为tar.gz

  3. 在解压后的文件夹内执行命令

  4. python3 setup.py install

第二种方式是

  1. 在pypi(https://pypi.org/project/)官方或者Python库(https://www.lfd.uci.edu/~gohlke/pythonlibs/)搜索你需要的库的名字

  2. 找到文件压缩包,文件格式为.wheel

  3. 下载wheel文件后,在wheel文件夹执行如下命令

  4. python3 -m pip install 文件名.wheel

requests其他常用功能

保存cookies,第一步登录你的账户密码获取cookie,然后使用cookie登录

1payload = {'username''admin''password''password'}
2r = requests.post('http://pythonscraping.com/pages/cookies/welcome.php', data=payload)
3print(r.cookies.get_dict())
4r = requests.get('http://pythonscraping.com/pages/cookies/profile.php', cookies=r.cookies)
5print(r.text)

使用Session自动化管理cookies

同样是执行上面的登录操作, 下面就是使用 session 的版本. 创建完一个 session 过后, 我们直接只用 session 来 post 和 get. 而且这次 get 的时候, 我们并没有传入 cookies. 但是实际上 session 内部就已经有了之前的 cookies 了.

1session = requests.Session()
2payload = {'username': 'admin', 'password': 'password'}
3r = session.post('http://pythonscraping.com/pages/cookies/welcome.php', data=payload)
4print(r.cookies.get_dict())
5r = session.get("http://pythonscraping.com/pages/cookies/profile.php")
6print(r.text) 

上传图片

1file = {'uploadFile'open('./image.png''rb')}
2r = requests.post('http://pythonscraping.com/files/processing2.php', files=file)
3print(r.text)

自动取消报警

1from requests.packages import urllib3
2urllib3.disable_warnings()

下载大文件

1r = requests.get('http://www.langzi.fun/tools.zip',stream=True)
2for it in r.iter_content(): 
3    with open('xx.zip','wb')as a:
4        a.write(it)

网页编码

之前我都是推荐使用chardet.detect方法获取网页的编码,但是我发现requests已经想的很周到了。

使用

1requests.utils.get_encodings_from_content(r.text)

即可获取网页的编码,返回对象是一个列表。取索引为0的值即可。

获取网页标题

1    r = requests.get(url,headers=headers(),allow_redirects=False,verify=False,timeout=10)
2    print(url + ':' + str(r.status_code))
3    encoding = requests.utils.get_encodings_from_content(r.text)[0]
4    res = r.content.decode(encoding,'replace')
5    title_pattern = '<title>(.*?)</title>'
6    title = re.search(title_pattern,res,re.S|re.I)


往期推荐

Python识别CMS与批量资产收集拓展

Python实现404页面识别实践

Sqlmap速查表/功能移植/Python批量检测SQL注入

Python常用技巧整理

Python 2/3 字符集编码

Python打包EXE方法汇总整理



本文始发于微信公众号(安全研发):Python安全开发之第三方库requests讲解【C10课】

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年12月15日03:18:56
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Python安全开发之第三方库requests讲解【C10课】http://cn-sec.com/archives/442547.html

发表评论

匿名网友 填写信息