기본 64 인코딩 URL을 안전하게 만들려면 어떤 문자 교체를 수행해야합니까?

StackOverflow https://stackoverflow.com/questions/1412391

문제

URL Safe Base 64 인코딩을 살펴보면 매우 비표준이라는 것을 알았습니다. PHP가 가지고있는 풍부한 수의 내장 기능에도 불구하고 URL Safe Base 64 인코딩을위한 것은 없습니다. 수동 페이지에서 base64_encode(), 대부분의 의견은 그 기능을 사용하는 것을 제안합니다. strtr():

function base64_url_encode($input)
{
     return strtr(base64_encode($input), '+/=', '-_,');
}

이 영역에서 찾을 수있는 유일한 Perl 모듈은 Mime :: Base64 :: Urlsafe (원천), 내부적으로 다음과 같은 교체를 수행합니다.

sub encode ($) {
    my $data = encode_base64($_[0], '');
    $data =~ tr|+/=|\-_|d;
    return $data;
}

위의 PHP 함수와 달리이 PERL 버전은 PHP와 마찬가지로 '='(Equals) 문자를 완전히 삭제합니다. Equals는 패딩 특성이므로 Perl 모듈은 Decode시 필요에 따라 대체하지만이 차이로 인해 두 구현이 호환되지 않습니다.

마지막으로, 파이썬 기능 urlsafe_b64encode (들) '='패딩을 유지하면서 누군가가 올라갈 것을 촉구합니다. 이 기능 Google 결과에 눈에 띄게 표시되는 패딩을 제거하려면 'Python Base64 URL Safe':

from base64 import urlsafe_b64encode, urlsafe_b64decode

def uri_b64encode(s):
    return urlsafe_b64encode(s).strip('=')

def uri_b64decode(s):
    return urlsafe_b64decode(s + '=' * (4 - len(s) % 4))

여기서 욕망은 추가 인코딩없이 URL에 포함될 수있는 문자열을 갖고 있으므로 '+', '/'및 '='의 문자 도랑 또는 번역. 정의 된 표준이 없으므로 올바른 방법은 무엇입니까?

도움이 되었습니까?

해결책

표준이있는 것처럼 보입니다. RFC 3548, 섹션 4, 기본 64 URL 및 파일 이름 안전 알파벳 인코딩:

이 인코딩은 표 2에 표시된 바와 같이 62 : ND 및 63 : RD 알파벳 특성을 제외하고는 이전의 인코딩과 기술적으로 동일합니다.

+ 그리고 / 교체해야합니다 - (minus) 그리고 _ (understrike) 각기. 호환되지 않는 라이브러리는 RFC 3548을 준수 할 수 있도록 래핑해야합니다.

이를 위해서는 URL이 인코딩해야합니다 (pad) = 문자이지만 나는 URL보다 인코딩하는 것을 선호합니다. + 그리고 / 표준 Base64 알파벳의 문자.

다른 팁

나는 옳고 그름이 있다고 생각하지 않습니다. 그러나 가장 인기있는 인코딩은입니다

'+/=' => '-_.'

이것은 Google, Yahoo에서 널리 사용됩니다 (Y64라고합니다). Java에서 사용한 가장 URL 안전 버전의 인코더 인 Ruby는이 문자 세트를 지원합니다.

urlencode를 통해 Base64_encode의 출력을 실행하는 것이 좋습니다. 예를 들어:

function base64_encode_url( $str )
{
    return urlencode( base64_encode( $str ) );
}

올바른 방법에 대해 묻는다면, 나는 임의의 문자 교체와 달리 적절한 URL 인코딩을 사용해 볼 것입니다. 첫 번째 Base64- 데이터를 인코딩 한 다음 적절한 URL 인코딩을 사용하여 "="와 같은 특수 문자를 추가로 인코딩합니다 (예 : %<code>).

당신은 그것을 a로 포장 해 보지 않겠습니까? urlencode()? 선적 서류 비치 여기.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top