%EF%BC%9F.png)
我正在自動化一個需要 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 中的使用者名稱和密碼幾年前的事了,而且看起來不會再回來了。