Password

如何在 curl 命令密碼欄位中轉義“@”

  • March 28, 2022

我的使用者名是user1,密碼是mypass8@

我希望將此使用者名和密碼傳遞給 curl 命令。

@將密碼傳遞給 curl 命令時如何轉義密碼?

curl -k -X POST https://user1:mypass8@@myshop.com/job/build

我收到錯誤消息:

消息:使用者的密碼/令牌無效:user1

我也嘗試了以下方法,但都失敗了,說明密碼不正確,2並且命令沒有在密碼中考慮curl

curl -k -X POST https://'user1:mypass8@'@myshop.com/job/build
curl -k -X POST https://"user1:mypass8@"@myshop.com/job/build
curl -k -X POST https://user1:"mypass8@"@myshop.com/job/build
curl -k -X POST https://user1:'mypass8@'@myshop.com/job/build

更新:我正在嘗試的登錄是 Jenkins 管理控制台。

你能建議嗎?

URL 使用百分比編碼,也就是 URL 編碼。

@符號就是%40這種編碼。

% curl -k -X POST https://user1:mypass8%40@myshop.com/job/build

或者使用-u/--user參數:

% curl -u user1:mypass8@ -k -X POST https://myshop.com/job/build

RFC 3986 第 3.2.1 節規定:

userinfo 子組件可能包含一個使用者名和可選的關於如何獲得訪問資源的授權的特定於方案的資訊。使用者資訊(如果存在)後跟一個@將其與主機隔開的商業標誌(“”)。

 userinfo    = *( unreserved / pct-encoded / sub-delims / ":" )

user:password不推薦在 userinfo 欄位中使用格式“ ”。應用程序不應將 userinfo 子組件中第一個冒號 (":") 字元後的任何數據呈現為明文,除非冒號後的數據是空字元串(表示沒有密碼)。當作為參考的一部分接收此類數據時,應用程序可以選擇忽略或拒絕此類數據,並且應拒絕以未加密形式儲存此類數據。以明文形式傳遞身份驗證資訊已被證明在幾乎所有使用它的情況下都存在安全風險。

為了使用者回饋而呈現 URI 的應用程序(例如在圖形超文本瀏覽中)應在可行的情況下以不同於 URI 其餘部分的方式呈現使用者資訊。如果使用者資訊被誤導性地製作成看起來像可信域名(第 7.6 節),這種呈現將有助於使用者。

使用這個小型 Go 應用程序進行了測試:

package main

import (
   "log"
   "net/http"
)

func auth(fn http.HandlerFunc) http.HandlerFunc {
   return func(w http.ResponseWriter, r *http.Request) {
       user, pass, _ := r.BasicAuth()
       if !check(user, pass) {
           http.Error(w, `Unauthorized.`, 401)
           return
       }
       fn(w, r)
   }
}

func check(user string, pass string) bool {
   if user == `user` && pass == `pass@` {
       return true
   }

   return false
}

func index(writer http.ResponseWriter, request *http.Request) {
   writer.Write([]byte(`hello, world!`))
}

func main() {
   http.HandleFunc("/", auth(index))
   if err := http.ListenAndServe(":8080", nil); err != nil {
       log.Fatal(err)
   }
}

執行伺服器:

% go run .

測試:

% curl -k -X POST http://user:pass%40@127.0.0.1:8080/ 
hello, world!

% curl -k -X POST http://user:pass@127.0.0.1:8080/ 
Unauthorized.

% curl --version
curl 7.72.0 (x86_64-pc-linux-gnu) libcurl/7.72.0 OpenSSL/1.1.1g zlib/1.2.11 zstd/1.4.5 libidn2/2.3.0 libpsl/0.21.1 (+libidn2/2.3.0) libssh2/1.9.0 nghttp2/1.41.0
Release-Date: 2020-08-19
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS GSS-API HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets zstd

引用自:https://unix.stackexchange.com/questions/609888