컬 명령 비밀번호 필드에서 "@"를 이스케이프 처리하는 방법

컬 명령 비밀번호 필드에서 "@"를 이스케이프 처리하는 방법

내 사용자 이름은 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

이것아포스트로피비밀번호에 @가 포함된 경우 ""가 필수입니다.

관련 정보