使用请求安全地处理潜在的恶意 URL

Safely handling potentially malicious URLs using Requests

我正在构建一个用于分析电子邮件的工具,以确定它们是否是网络钓鱼,我想看看电子邮件重定向中是否有任何 links,以及它们是否做多少次,去哪里。我目前正在使用请求库来处理所有这些东西,为了获得 link 的历史记录,您必须调用 .get()。对潜在的恶意 URL 执行此操作安全吗?如果不安全,我有什么方法可以获得重定向信息而不会使我的计算机处于危险之中?

您可以发送 HEAD 请求 allow_redirects=True:

>>> url = ""
>>> resp = requests.request(
...     "HEAD",
...     url,
...     allow_redirects=True
... )
>>> resp.history
[<Response [301]>, <Response [302]>]
>>> [i.url for i in resp.history]
['', '

并不是说这是万灵药。其他需要考虑的是在 URL 本身上添加一些启发式方法,本着 "you know a crappy-looking URL when you see one." 的精神(我喜欢 yarl 来分析 URLs。)例如:

  • 文件扩展名是什么?
  • URl 是否使用了非标准端口?
  • 域是 IPv4/6 地址还是本地主机?
  • 任何查询参数值本身是否有效 URLs?

...等等。