Ne karakter değiştirmeleri base 64 encoding URL güvenli hale getirmek için yapılmalıdır?

5 Cevap php

URL güvenli Bankası 64 kodlaması bakarken, ben bir çok standart dışı bir şey olarak buldum. PHP sahip fonksiyonları yerleşik bol sayısına rağmen, URL güvenli Bankası 64 kodlama için bir tane değil. Için manuel sayfasında base64_encode() , most of the comments suggest using that function, wrapped with strtr():

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

Ben bu alanda bulabildiğim tek Perl modülü dahili aşağıdaki değişimini gerçekleştirir ki, MIME::Base64::URLSafe (source) olduğunu:

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

PHP yaptığı gibi yukarıdaki PHP fonksiyonunun aksine, bu Perl sürümü oldukça ile değiştirerek daha tamamen '=' (eşittir) karakteri, ',' (virgül) düşer. Bir dolgu karakter Eşittir, yani decode üzerine gerektiği gibi Perl modülü değiştirir, ama bu fark iki uygulamaları uyumsuz yapar.

Son olarak, Python fonksiyon urlsafe_b64encode(s) this function 'python base64 url safe' için Google sonuçlarında belirgin gösteren dolgu kaldırmak kadar koymak birine isteyen, çevresinde '=' dolgu tutar :

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))

Burada arzu dolayısıyla ditching veya çeviri karakterlerin '+', '/' arasında ve '=', başka kodlama olmadan bir URL'ye dahil edilebilir bir dize sahip olmaktır. Bir standart tanımlı olmadığından, what is the right way?

5 Cevap

Bir standart olması görünmüyor, o RFC 3548, 4. Bölüm, Base 64 Encoding with URL and Filename Safe Alphabet:

This encoding is technically identical to the previous one, except for the 62:nd and 63:rd alphabet character, as indicated in table 2.

+ ve /, sırasıyla - (minus) ve _ (understrike) ile değiştirilmelidir. RFC 3548 ile uyumlu böylece herhangi bir uyumsuz kütüphaneler sarılmalıdır.

Bu size (pad) = karakterleri kodlamak URL'ye, ama ben tercih gerektirdiğini unutmayın + ve standart base64 alfabesinden / karakter kodlama URL bitti.

Doğru ya da yanlış olduğunu düşünmüyorum. Ama en popüler kodlama

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

Bu yaygın Google, Yahoo (onlar Y64 diyoruz) tarafından kullanılır. Java kullanılan encoder en url güvenli sürümü, Ruby bu karakter setini destekler.

Ben urlencode yoluyla base64_encode çıkışını çalışan öneririm. Örneğin:

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

Eğer doğru bir yol hakkında soruyorsun karakter keyfi yerine aksine, ben uygun URL-kodlama ile gitmek istiyorum. Öncelikle veri base64 kodlamak, daha sonra uygun URL-kodlama ile "=" gibi özel karakterleri kodlamak (yani %<code>).

Neden bir urlencode() sararak denemiyorsunuz? Belgeler here.