如何在 URL 参数中的 HTTP 基本身份验证密码中传递问号(?)?

如何在 URL 参数中的 HTTP 基本身份验证密码中传递问号(?)?

我正在自动化一个需要 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 中的用户名和密码几年前它就已经出现了,而且看起来它不会再回来了。

相关内容