如何修复 InsecureRequestWarning:正在向主机发出未经验证的 HTTPS 请求

TNT*_*TNT 11 python python-requests

我正在尝试从 url 下载 zip 文件,但收到以下警告

InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.ons.gov.uk'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings   
Run Code Online (Sandbox Code Playgroud)

我读了一点关于这一点的内容,大多数线程都围绕如何禁用它(如果您知道自己在做什么)以及整个一般概念。据我了解,库默认情况request不能执行证书验证吗?为什么我应该向开源文件发出安全请求?我在这里暴露了自己的一些东西,我该如何解决这个问题?

这是我的代码

import pandas as pd
import requests
from requests.auth import HTTPBasicAuth
from zipfile import ZipFile
import io

url = "https://www.ons.gov.uk/file?uri=%2fpeoplepopulationandcommunity%2fhousing%2fdatasets%2fukhousebuildingpermanentdwellingsstartedandcompleted%2fcurrent/ukhousebuilding.zip"


response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}, verify=False)
with ZipFile(io.BytesIO(response.content)) as myzip:
    with myzip.open(myzip.namelist()[0]) as hfile:
        df = pd.read_csv(hfile)

print(df)
Run Code Online (Sandbox Code Playgroud)

显然这个警告只在我使用时出现verify=False,它实际上不应该阻止这个警告吗?

抱歉问了太多问题,但我想了解这里发生的事情。如果我误解了这个概念,请纠正我。

Sve*_*TUM 7

据我了解,请求库默认情况下不能够执行证书验证吗?

是的,它确实。

为什么我应该向开源文件发出安全请求?

出于安全原因。您希望确保您确实从请求的来源获得了您期望的文件,而不对文件进行任何操作。

我在这里暴露了自己的一些东西,我该如何解决这个问题?

是的,你是。删除verify=False参数。

显然,只有当我使用 verify=False 时才会出现此警告,它实际上不应该阻止此警告吗?

不,这正是导致警告的原因。仔细阅读。它会警告您有关未经验证的 HTTPS 请求。由于您指定了该请求,因此该请求未经验证。

长话短说

如果请求在没有verify=False参数的情况下工作,则不应使用它。否则你仍然不应该使用它并寻找其他解决方案。

  • 您的浏览器或操作系统有一个预安装的根证书列表。它们属于证书颁发机构 (CA)。这些证书颁发机构可以向其他实体(例如网站)颁发和签署证书,因此您的浏览器可以信任很多网站证书。这些证书保存您的通信的加密密钥,还保存有关您的通信合作伙伴的信息,因此,如果您使用该密钥加密您的数据,您应该确信只有您所寻址的实体才能真正解密和读取您的数据。 (2认同)

Rad*_*odó 1

requests默认情况下会自行进行证书验证。您已明确指示图书馆不要这样做verify=False,因此会出现警告。

即使您可能认为请求的资源是公共的,您也应该尽可能地保护数据传输。如果没有正确的 TLS/SSL 验证,中间人攻击者就可以拦截您的连接。拦截可能会产生不同的结果:

  • 攻击者可能会了解您的通信——违反机密性
  • 攻击者可能会更改所获取数据的内容——破坏完整性。

根据使用所获取数据的代码,攻击者可能能够影响其执行,在最坏的情况下,他/她可能会尝试利用处理代码中的安全漏洞来实现计算系统的妥协(最终是远程代码执行)。