【问题标题】:Obfuscate password in url混淆url中的密码
【发布时间】:2017-04-23 13:04:45
【问题描述】:

我想隐藏 URL 中的密码以进行记录。我希望通过解析、用虚拟密码替换密码和反解析来使用urlparse,但这给了我:

>>> from urllib.parse import urlparse
>>> parts = urlparse('https://user:pass@66.66.66.66/aaa/bbb')
>>> parts.password = 'xxx'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute

所以替代方案似乎是this,这似乎有点矫枉过正。

有没有更简单的方法来替换密码,使用标准库?

【问题讨论】:

  • 这里的parts 是什么?
  • @AKS:对不起,我认为这很清楚。添加了更多上下文。
  • @janbrohl:这正是链接脚本正在做的事情,这对我来说似乎有点矫枉过正,因为 urlparse 不允许设置单独的组件。
  • 我认为最好的方法之一是编写一个记录器处理程序,它会在创建日志时混淆密码
  • 对于更简单的解决方案,您不能通过获取类似 :pass@ 的任何内容并替换它来直接替换字符串吗?

标签: python logging obfuscation urlparse


【解决方案1】:

urlparse 返回一个(子类)命名元组。使用namedtuple._replace() method 生成一个新副本,并在其上使用geturl() 'unparse'。

密码是netloc属性的一部分,可以进一步解析:

from urllib.parse import urlparse

def replace_password(url):
    parts = urlparse(url)
    if parts.password is not None:
        # split out the host portion manually. We could use
        # parts.hostname and parts.port, but then you'd have to check
        # if either part is None. The hostname would also be lowercased.
        host_info = parts.netloc.rpartition('@')[-1]
        parts = parts._replace(netloc='{}:xxx@{}'.format(
            parts.username, host_info))
        url = parts.geturl()
    return url

演示:

>>> replace_password('https://user:pass@66.66.66.66/aaa/bbb')
'https://user:xxx@66.66.66.66/aaa/bbb'

【讨论】:

  • 这太天才了!让我测试一下。
  • @delavnog:小问题:没有密码字段;我会用正确的字段更新。
  • 为什么不只检查parts.password is not None
  • @warvariuc:因为我忘记了那个属性 ;-)
  • 好的,这是一个很好的中间地带:那里有一些自定义解析,但似乎无害。不如原来的替换密码想法好,但我猜 urlparse / urlunparse 不允许这样做。谢谢!
猜你喜欢
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
  • 2017-10-08
  • 2019-03-30
  • 1970-01-01
相关资源
最近更新 更多