curlコマンドパスワードフィールドで「@」をエスケープする方法

curlコマンドパスワードフィールドで「@」をエスケープする方法

私のユーザー名はuser1パスワードですmypass8@

このユーザー名とパスワードをカールコマンドに渡したいと思います。

@パスワードをカールコマンドに渡すときにパスワードをエスケープする方法は?

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 Management Consoleです。

何か提案してもらえますか?

答え1

URLの使い方パーセントエンコーディングURLエンコーディングとも呼ばれます。

@%40このエンコーディングのシンボル。

% curl -k -X POST https://user1:mypass8%[email protected]/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フィールドでは廃止されました。アプリケーションは、コロンの後のデータが空の文字列(パスワードなしを示す)でない限り、UserInformationサブコンポーネントの最初のコロン( ":")文字の後のデータをプレーンテキストとしてレンダリングしないでください。アプリケーションは、参照の一部として受信したデータを無視または拒否することを選択でき、そのデータを暗号化されていない形式で保存することを拒否する必要があります。テキストで認証情報を渡すことは、ほとんどすべてのユースケースでセキュリティ上のリスクがあることが証明されています。

可能であれば、ユーザーフィードバックのために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%[email protected]:8080/ 
hello, world!

% curl -k -X POST http://user:[email protected]: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

答え2

Base64変換を使用して問題を解決しました。

echo -n '[USERNAME]:[PASSWORD]' | base64

これにより、次のようにカールするためのヘッダーに渡されるトークンが生成されます。

curl -H 'Authorization: Basic [add value obtained from the previous cmd]'

答え3

正常にURLエンコードが完了しました@。問題は、ユーザー名、パスワードをホストとして扱うと言うときに間違っていることです。http://myuser:myp@[email protected]/filemyusermyp[email protected]

したがって、次のことを行うと:

user="myuser"
pass="$( printf 'myp@ssword' | sed 's/@/%40/g' )"
curl "https://${user}:${pass}@host.example.com/file"

あなたはより良い幸運を持っている必要があります。

答え4

動作しない:

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

布材:

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

これアポストロフィパスワードに@が含まれている場合は「」が必須です。

関連情報