我正在自动化一个需要 HTTP 基本身份验证的网站。
此链接中给出的建议在大多数情况下都很有效:
您可以在 URL 参数中传递 HTTP 基本身份验证的用户/密码吗?
但是有些用户的密码中有问号(?
)。请教如何去掉问号。
PS 我知道@
用户名可以转义为%40
。
答案1
我想你指的是用户信息传递用户凭据的 URL 的一部分,而不是“URL 参数”(URL 参数是请求参数):
https://<userinfo>@example.com/foo?<query-string>
与 URL 任何部分中不允许使用的任何字符(因为它可能具有特殊含义)一样,它必须经过 URL 编码(百分比编码)%
后跟该字符的两位十六进制代码。
所以,@
是%40
且?
是%3F
。
但这两个字符并不是唯一需要进行 URL 编码的字符。您应该将值传递给脚本中的 URL 编码函数,以正确地对 URL 的该部分进行 URL 编码。
RFC 3986定义哪些字符是允许的(未编码的)用户信息URL 的一部分:
userinfo = *( unreserved / pct-encoded / sub-delims / ":" ) unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" pct-encoded = "%" HEXDIG HEXDIG sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "="
因此,其他所有内容都必须进行百分比编码,包括:
和%
- 如果它们是用户或者密码部分(为了否定其特殊含义)。
同一文件中还指出:
不推荐在用户信息字段中使用“用户:密码”格式。
因此,浏览器支持一直不完善,版本不断变化(安全是主要问题)。我相信最新版本的 Chrome(测试版 v79)和 Firefox 确实支持 URL 中的用户凭据。我看到评论说这也适用于最新的 Safari(?),尽管这已经很长时间没有用了,而且目前对我来说也不起作用(尽管我没有在 iOS 12.4.1 上运行最新版本)。并且IE 不再支持 URL 中的用户名和密码几年前它就已经出现了,而且看起来它不会再回来了。