URL base64 kodlanmış dizeleri geçirmeden

7 Cevap php

Bu GET parametreler üzerinden ham base64 olarak kodlanmış dizeler geçirmek için güvenli midir?

7 Cevap

Hayır, base64 dizeleri "+", "=" içerebilir beri, bunu kodlamak url gerekir ve verilerin anlamını değiştirebilir "/" karakter - bir alt klasör gibi görünüyorsun.

Geçerli base64 karakterler altındadır.

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=

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() girdi, ancak gereksiz ve bu nedenle gereksiz olacağını güvenli olacaktır.

Ben bu güvenli olduğunu sanmıyorum, çünkü örneğin "=" karakteri ham bazın 64 kullanılan ve aynı zamanda HTTP GET değerlerden parametreleri ayırmada kullanılır.

Teorik olarak, evet, sürece maksimum url ve istemci veya sunucu için / oor sorgu dize uzunluğunu aşmamak gibi.

Uygulamada, işler biraz yanıltıcıdır alabilirsiniz. Değer bir "on" içermesi için olur ve firar "==" in bırakırsanız Örneğin, ASP.NET bir HttpRequestValidationException tetikleyebilir.