Python使用validators库验证含方括号密码的URL失败如何解决?
方案1:合规的URL百分号编码(推荐,符合RFC标准)
按照RFC 3986规范,[、]属于URI保留字符,出现在用户名/密码段时需要先做百分号编码,编码后再使用validators校验即可通过,不需要修改库源码:[ 编码为 %5B,] 编码为 %5D
示例代码:
import urllib.parse import validators def encode_url_userinfo(url): if "@" not in url: return url userinfo_part, host_part = url.rsplit("@", 1) scheme, userinfo = userinfo_part.split("://", 1) # 拆分用户名和密码 if ":" in userinfo: user, pwd = userinfo.split(":", 1) # 编码密码中的特殊字符 encoded_pwd = urllib.parse.quote(pwd) encoded_userinfo = f"{user}:{encoded_pwd}" else: encoded_userinfo = urllib.parse.quote(userinfo) return f"{scheme}://{encoded_userinfo}@{host_part}" # 测试用例 raw_url = "https://p124_ddm028127:PN-[.d.g5(R{bK}[5ZLx,4~K*hHrSy32=q+@git.net/scm/sample-config.git" processed_url = encode_url_userinfo(raw_url) print(validators.url(processed_url)) # 输出True
该方案不需要修改第三方库代码,符合URI标准,兼容性最好。
方案2:修复正则写法(如果必须校验未编码的原始URL)
你之前修改正则不生效的核心原因是:方括号在正则字符集中的位置不对,]如果没有放在字符集的最开头,会被识别为字符集的结束标记,导致整个正则匹配逻辑异常。
正确的修改方式是把]放在密码段字符集的最开头,不需要额外转义即可正确识别,你可以基于validators的完整URL正则替换用户信息段规则,自行实现校验逻辑:
import re import validators # 提取validators 0.18.1的完整URL正则,仅修改用户信息段的密码规则 custom_url_re = re.compile( r"^" # 修复后的用户信息校验段 r"(?:[-a-z\u00a1-\uffff0-9._~%!$&'()*+,;=:]+" r"(?::][-a-z0-9._~%!$&'()*+,;=:\[]*)?@)?" # 以下保持原库的域名/IP/路径等校验逻辑不变 r"(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)" r"(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*" r"(?:\.[a-z\u00a1-\uffff]{2,})\.?" r"(?::\d{2,5})?" r"(?:/\S*)?" r"$", re.IGNORECASE ) def custom_validate_url(url): return custom_url_re.match(url) is not None
也可以直接将validators库升级到最新版本,最新版已经修复了用户信息段特殊字符的匹配问题。
方案3:完善urllib.parse自定义校验
你之前写的urlparse校验逻辑过于宽松,大量非法URL也会通过,可补充校验规则适配业务需求:
from urllib.parse import urlparse def validate_url(url, allowed_schemes=("http", "https", "git", "ssh")): try: result = urlparse(url) # 按需自定义校验规则 if result.scheme not in allowed_schemes: return False if not result.netloc: return False # 可额外补充域名格式校验、端口范围校验等规则 return True except ValueError: return False
该方案不需要依赖第三方validators库,灵活性最高,可根据业务需求自由调整校验规则。
内容的提问来源于stack exchange,提问作者Kaliyug Antagonist
相关产品推荐
相关产品推荐

