Bu GET parametreler üzerinden ham base64 olarak kodlanmış dizeler geçirmek için güvenli midir?
Ek base64 özellikleri vardır. (Özellikler için here tabloya bakın). 26 küçük + 26 harf + 10 basamaklı = 62: Ama aslında kodlamak için 65 karakter gerekir.
Sen '=' iki ['+', '/'] ve dolgu karakter gerekir. Ama bunların hiçbiri url dostu olan, yani just use different chars for them ve hazırsınız. [- '_' '], Ama sürece onlara aynı çözümlenmiş ve başkaları ile paylaşmak gerek yoktu gibi diğer karakter kullanabilirsiniz Yukarıdaki grafikten standart olanlardır.
Ben sadece kendi yardımcıları yazma tavsiye ederim. Üzerindeki yorumlarından bu gibi php manual page for base64_encode:
function base64_url_encode($input) {
return strtr(base64_encode($input), '+/=', '-_,');
}
function base64_url_decode($input) {
return base64_decode(strtr($input, '-_,', '+/='));
}
@ Joeshmo Veya bunun yerine bir yardımcı işlevi yazma, sadece dize kodlanmış base64 UrlEncode olabilir. Bu yardımcı fonksiyonu olarak, ancak iki ekstra fonksiyonlar gerek kalmadan aynı şeyi yapardı.
$str = 'Some String';
$encoded = urlencode( base64_encode( $str ) );
$decoded = base64_decode( urldecode( $encoded ) );
Introductory Note Ben burada bazı yanıtları biraz yanıltıcı beri (yanlış değilse) bir kaç açıklama göndermek eğiliminde değilim.
Artı işaretleri $ _GET küresel dizinin içindeki bir UZAYDA dönüştürülür beri The answer is NO, sadece bir URL sorgu dizesi içinde bir base64 kodlanmış parametre geçemez. Başka bir deyişle, test.php?myVar=stringwith+sign gönderilen eğer
//test.php
print $_GET[myVar];
the result would be:
stringwith sign
The easy way to solve this is to simply urlencode()
your base64 string before adding it to the query string to escape the +, =, and / characters to %## codes.
For instance, urlencode("stringwith+sign")
returns stringwith%2Bsign
When you process the action, PHP takes care of decoding the query string automatically when it populates the $_GET global. For example, if I sent test.php?myVar=stringwith%2Bsign to
//test.php
print $_GET[myVar];
the result would is:
stringwith+sign
You do not want to urldecode()
the returned $_GET string as +'s will be converted to spaces.
In other words if I sent the same test.php?myVar=stringwith%2Bsign to
//test.php
$string = urldecode($_GET[myVar]);
print $string;
the result is an unexpected:
stringwith sign
Bu rawurldecode()
a> girdi, ancak gereksiz ve bu nedenle gereksiz olacağını güvenli olacaktır.
Evet ve hayır.
Base64 temel charset bazı durumlarda URL'lerin kullanılan geleneksel kuralları ile çarpışır olabilir. Ama base64 uygulamaların çok daha iyi URL'ler maç ya da (Python en urlsafe_b64encode()
a> gibi) biri ile gelip size charset değiştirmenize izin verir.
Bu tür sınırı eksikliği - size dönük olabilir başka konu URL uzunluğu ya da daha doğrusu sınırıdır. Standartlar herhangi maksimum uzunluk, tarayıcılar, sunucular, kütüphaneler ve diğer yazılım belirtmek yok çünkü HTTP protokolü ile çalışan 'kendi sınırlarını tanımlayabilir. Bu makalenin bir göz alabilir: WWW FAQs: What is the maximum length of a URL?