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

San*_*rde 5 url .htaccess encoding selenium

我正在自动化一个需要 HTTP 基本身份验证的网站。

在大多数情况下,此链接中给出的建议非常有效:

您可以在 URL 参数中传递 HTTP 基本身份验证的用户名/密码吗?

但部分用户的密码中带有问号(?)。请告知如何避免问号。

PS我知道@在用户名中可以转义为%40.

MrW*_*ite 5

我假设您必须指的是传递用户凭据的 URL 的userinfo部分,而不是“URL 参数”(它是query-string的一部分):

https://<userinfo>@example.com/foo?<query-string>
Run Code Online (Sandbox Code Playgroud)

与 URL 任何部分中不允许出现的任何字符一样(因为它可能具有特殊含义),它必须进行 URL 编码(百分比编码),%后跟该字符的两位十六进制代码。

所以,@%40并且?%3F

但这些并不是唯一可能需要 URL 编码的两个字符。您应该通过脚本中的 URL 编码函数传递该值,以正确对 URL 的该部分进行 URL 编码。

RFC 3986定义了URL 的userinfo部分允许使用哪些字符(未编码) :

userinfo    = *( unreserved / pct-encoded / sub-delims / ":" )
unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded = "%" HEXDIG HEXDIG
sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
Run Code Online (Sandbox Code Playgroud)
              / "*" / "+" / "," / ";" / "="
Run Code Online (Sandbox Code Playgroud)

因此,其他所有内容都必须进行百分比编码,包括:%- 如果它们是用户密码部分的一部分(以便否定它们的特殊含义)。

同一份文件中还指出:

不推荐在 userinfo 字段中使用“user:password”格式。

因此,浏览器支持一直不完整,版本不断变化(安全性是首要问题)。我相信最新版本的 Chrome(已测试 v79)和 Firefox 确实支持 URL 中的用户凭据。我看到评论说这也适用于最新的 Safari(?),尽管这已经工作了很长时间并且目前对我不起作用(尽管我没有在 iOS 12.4.1 上运行最新版本) )。几年前,IE就不再支持 URL 中的用户名和密码,而且现在看起来也不会再回来了。