Yanıtlar:
Hayır, url kodlaması yapmanız gerekir, çünkü base64 dizeleri verilerinizin anlamını değiştirebilecek "+", "=" ve "/" karakterlerini içerebilir - bir alt klasör gibi görünür.
Geçerli base64 karakterleri aşağıda.
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
Ek base64 özellikleri var. (Tabloya bakın burada kesin bilgi için). Ama aslında kodlamak için 65 karaktere ihtiyacınız var: 26 küçük harf + 26 büyük harf + 10 basamak = 62.
İki tane daha ['+', '/'] ve bir dolgu karakteri '=' gerekir. Ama hiçbiri url dostu değil, bu yüzden onlar için farklı karakterler kullanın ve hazırsınız. Yukarıdaki grafikten standart olanlar ['-', '_'], ancak aynı kodları çözdüğünüz sürece başka karakterleri de kullanabilirsiniz ve başkalarıyla paylaşmanız gerekmez.
Sadece kendi yardımcılarını yazmanı tavsiye ederim. Base64_encode için php kılavuz sayfasındaki yorumlar gibi :
function base64_url_encode($input) {
return strtr(base64_encode($input), '+/=', '._-');
}
function base64_url_decode($input) {
return base64_decode(strtr($input, '._-', '+/='));
}
urlencode
rodrigo-silveira'nın cevabının önerdiği şekilde kullanmanızı öneririm. Url uzunluğunda birkaç karakter kaydetmek için iki yeni işlev oluşturmak, sadece kapıyı kullanmak yerine pencereden geçen evinize girmek gibidir.
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
,
üzere urlencoded edilmelidir %2C
, ben kullanmanızı öneririz ._-
yerine -_,
tek varyantı gibi en.wikipedia.org/wiki/Base64#Variants_summary_table = sondaki tutar
@joeshmo Veya bir yardımcı işlev yazmak yerine, base64 kodlu dizeyi urlencode edebilirsiniz. Bu, yardımcı fonksiyonunuzla aynı şeyi yapar, ancak iki ekstra fonksiyona ihtiyaç duymaz.
$str = 'Some String';
$encoded = urlencode( base64_encode( $str ) );
$decoded = base64_decode( urldecode( $encoded ) );
/
Bir GET parametresi olarak değil, URL'de bir yol olarak iletirseniz , karaktere dikkat edin . Her /
iki tarafta başka bir şeyle değiştirmezseniz yolunuzu değiştirecektir .
Giriş Notu Buradaki bazı cevaplar biraz yanıltıcı olduğu için (yanlış değilse) birkaç açıklama yapmaya meyilliyim.
Cevap HAYIR , artı işaretleri $ _GET global dizisi içindeki bir SPACE değerine dönüştürüldüğünden, bir URL sorgu dizesine base64 kodlu bir parametre iletemezsiniz. Başka bir deyişle, test.php? MyVar = stringwith + sign to
//test.php
print $_GET['myVar'];
sonuç şöyle olur:
stringwith sign
Bunu çözmenin kolay yolu urlencode()
,% ,# kodlarına +, = ve / karakterlerinden kaçmak için sorgu dizesine eklemeden önce base64 dizenizi basitçe belirlemektir . Örneğin, için urlencode("stringwith+sign")
getirilerstringwith%2Bsign
Eylemi işlediğinizde PHP, $ _GET global öğesini doldurduğunda sorgu dizesinin kodunu otomatik olarak çözer. Örneğin, test.php? MyVar =% 2Bsign ile dize gönderirsem
//test.php
print $_GET['myVar'];
sonuç:
stringwith+sign
Sen do not istiyorum urldecode()
+ 'ın boşluk dönüştürülecektir olarak $ _GET dize döndü.
Bir başka deyişle aynı gönderilen eğer test.php? MyVar = stringwith% 2Bsign için
//test.php
$string = urldecode($_GET['myVar']);
print $string;
sonuç beklenmedik bir sonuçtur:
stringwith sign
rawurldecode()
Girdi için güvenli olabilir , ancak gereksiz ve dolayısıyla gereksiz olacaktır.
<br>
, çok fazla HTML yazmanıza gerek kalmaz. Umarım bu yardımcı olur, cevabınızı daha da geliştirmek için biraz düzenledim.
Evet ve hayır.
Base64'ün temel karakter dizisi bazı durumlarda URL'lerde kullanılan geleneksel sözleşmelerle çakışabilir. Ancak base64 uygulamalarının çoğu, URL'yi daha iyi eşleştirmek veya hatta biriyle (Python'lar gibi urlsafe_b64encode()
) eşleştirmek için karakter kümesini değiştirmenize olanak tanır .
Karşılaşabileceğiniz bir diğer sorun URL uzunluğu sınırı veya daha doğrusu - bu tür bir sınırın olmamasıdır. Standartlar herhangi bir maksimum uzunluk belirtmediği için, tarayıcılar, sunucular, kütüphaneler ve HTTP protokolüyle çalışan diğer yazılımlar kendi sınırlarını tanımlayabilir. Bu makaleye göz atabilirsiniz: WWW SSS: Bir URL'nin maksimum uzunluğu nedir?
Onun deneyebileceğiniz bir base64url kodlaması, yukarıdaki joeshmo kodunun sadece uzantısı.
function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
function base64url_decode($data) {
return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
}
Teoride, istemci veya sunucu için maksimum URL ve / veya sorgu dizesi uzunluğunu aşmadığınız sürece evet.
Pratikte, işler biraz daha hileli olabilir. Örneğin, değer bir "açık" içeriyorsa ve "==" izinden ayrılırsanız ASP.NET üzerinde bir HttpRequestValidationException tetikleyebilir.
Url güvenli kodlama için, base64.urlsafe_b64encode(...)
aşağıdaki kodda olduğu gibi,% 100 için bana çalışır
function base64UrlSafeEncode(string $input)
{
return str_replace(['+', '/'], ['-', '_'], base64_encode($input));
}
Evet, her zaman güvenlidir. Tabii ki base64 şunları içerir:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
ancak base64 kodlu bir dizede genellikle hayır vardır +
. +
boş bir alana dönüştürülecek ve yanlış kod çözme dizesine neden olacaktır. /
get parametreleri çiftinde güvenlidir. =
her zaman base64 kodlu dizenin sonundadır ve sunucu tarafı =
doğrudan çözülebilir .