기본 64 인코딩 URL을 안전하게 만들려면 어떤 문자 교체를 수행해야합니까?
문제
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()
? 선적 서류 비치 여기.