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

时间:2017-10-27 21:22:34

标签: python ftp ipv6 ipv4 urlparse

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

我们的数据库中包含以下格式的网址:

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

密码是否应加密并存储在单独的列中?可能。

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

无论如何,我们有一个遗留系统被重新激活以处理这项工作,但它并不理想。有关如何处理此问题的任何想法(除了更改密码)? urlparse还有其他选择吗?

Python3 equiv具有相同的问题。如果我知道它会修复它,我会经历升级到Python3的痛苦。

1 个答案:

答案 0 :(得分:3)

总结: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