利用Python处理向不受信任主机发送请求

,HTTP vs HTTPS

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。

为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

HTTPS和HTTP的区别主要为以下四点:

(1)  https协议需要到ca申请证书,一般免费证书很少,需要交费。

(2)  http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。

(3)  http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

(4)  http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

 

理解的部分倒是容易啊, 只是用代码处理的时候稍有不同.

以下会用到python原生模块http.client, 升级版urllib, 封装很优美的requests.

http.client处理受信息的主机, 倒是和普通地处理http请求差不多.

只是在处理不受信任的主机时, 会引入context参数. 直接使用原生模块发送该请求的貌似还是少数, 在网上资料很难找到. 翻看源码的时候, 发现了一个参数context

添加context参数以后, 可以正常向不受信任的主机发送请求了. 以下是http.client,  urllib, 以及requests的处理方式.

import http.client, ssl

#   禁用所有的验证
context = ssl._create_unverified_context()
#   与服务器建立连接, 并使用context参数
conn = http.client.HTTPSConnection('localhost',8443, context=context)
url = '/agileone/'
#   向服务器发起GET请求
conn.request('GET',url)
#   获取响应并解码
response = conn.getresponse().read().decode()
#   打印响应
print(response)
import urllib.request

context = ssl._create_unverified_context()
url = 'https://localhost:8443/agileone/'
r = urllib.request.urlopen(url, context=context)
response = r.read().decode()
print(response)
#   利用证书处理不信任站点
import requests
url = 'https://localhost:8443/agileone/'
r = requests.get(url, verify = False)
r.encoding = 'utf-8'
print(r.text)

 

posted on 2018-01-23 16:10  小王子1110  阅读(219)  评论(0编辑  收藏  举报

导航