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的痛苦。
答案 0 :(得分:3)
总结:Python行为正确。你对正确行为的理解是错误的。
URI的语法在RFC 4986中定义。关于userinfo
(即username
或username: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
。