如何在 URL 參數中傳遞 HTTP 基本驗證密碼中的問號 (?)?

如何在 URL 參數中傳遞 HTTP 基本驗證密碼中的問號 (?)?

我正在自動化一個需要 HTTP 基本驗證的網站。

在大多數情況下,此連結中給出的建議非常有效:

您可以在 URL 參數中傳遞 HTTP 基本驗證的使用者名稱/密碼嗎?

?但部分使用者的密碼中帶有問號( )。請告知如何避免問號。

PS我知道@在用戶名中可以轉義為%40.

答案1

我想你一定指的是使用者資訊傳遞使用者憑證的 URL 的一部分,而不是「URL 參數」(它們是請求參數):

https://<userinfo>@example.com/foo?<query-string>

與 URL 任何部分中不允許出現的任何字元一樣(因為它可能具有特殊含義),它必須經過 URL 編碼(百分比編碼)%後面跟著該字元的兩位十六進位代碼。

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

但這些並不是唯一可能需要 URL 編碼的兩個字元。您應該透過腳本中的 URL 編碼函數傳遞該值,以正確對 URL 的該部分進行 URL 編碼。

RFC 3986定義哪些字元是允許的(未編碼的)使用者資訊網址的一部分:

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

因此,其他所有內容都必須進行百分比編碼,包括:%- 如果它們是使用者或者密碼部分(為了否定有特殊意義)。

同一份文件中也指出:

不建議在 userinfo 欄位中使用“user:password”格式。

因此,瀏覽器支援一直不完整,版本不斷變化(安全性是首要問題)。我相信最新版本的 Chrome(已測試 v79)和 Firefox 確實支援 URL 中的使用者憑證。我看到評論說這也適用於最新的 Safari(?),儘管這已經工作了很長時間並且目前對我不起作用(儘管我沒有在 iOS 12.4.1 上運行最新版本) )。和IE 不再支援 URL 中的使用者名稱和密碼幾年前的事了,而且看起來不會再回來了。

相關內容