Python:urlparse 将 URL 与 IPv6 密码中的括号混淆

Python: urlparse confuses URL with bracket in the password for IPv6

Python 2.7(虽然这也体现在 Python 3 中)

我们有一个充满以下形式 URL 的数据库:

ftp://username1:password1@www.google.com/ ftp://username2:password2@www.google.com/ 等等

是否应该将密码加密并存储在单独的列中?应该是吧。

我们的一位用户最近更改了批处理作业帐户的密码以包含括号。每当它尝试对它进行 urlparse 时,这就会使我们的脚本崩溃。 Urlparse 将其解释为格式错误的 IPv6 地址。我认为这是 urlparse 不尊重 @ 符号的失败,但我可能是错的。

无论如何,我们有一个遗留系统被重新激活来处理这项工作,但它并不理想。关于如何处理这个问题的任何想法(除了更改密码)?是否有 urlparse 的替代方案?

Python3 equiv 也有同样的问题。如果我知道升级到 Python3 会解决问题,我会经历痛苦。

总结:Python 行为正确。你对正确行为的理解是错误的。


URI 的语法在 RFC 4986 中定义。关于 userinfo(即 usernameusername:password)的相关部分清楚地说明 userinfo:

中不允许使用普通的 '['
authority     = [ userinfo "@" ] host [ ":" port ]
userinfo      = *( unreserved / pct-encoded / sub-delims / ":" )

pct-encoded   = "%" HEXDIG HEXDIG
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

可以看出,“[”既不是 unreserved 的一部分,也不是 sub-delims 的一部分。这意味着您必须使用百分比编码对该字符进行编码,即 %5B.