Apakah aman untuk melewatkan string yang disandikan base64 mentah melalui parameter GET?
Apakah aman untuk melewatkan string yang disandikan base64 mentah melalui parameter GET?
Jawaban:
Tidak, Anda perlu menyandi-urlnya, karena string base64 dapat berisi karakter "+", "=" dan "/" yang dapat mengubah arti data Anda - terlihat seperti sub-folder.
Karakter base64 yang valid ada di bawah ini.
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
Ada spesifikasi base64 tambahan. (Lihat tabel di sini untuk rinciannya). Tetapi pada dasarnya Anda membutuhkan 65 karakter untuk menyandikan: 26 huruf kecil + 26 huruf besar + 10 digit = 62.
Anda membutuhkan dua lagi ['+', '/'] dan char padding '='. Tapi tidak satu pun dari mereka yang ramah url, jadi gunakan saja karakter yang berbeda untuk mereka dan Anda siap. Yang standar dari bagan di atas adalah ['-', '_'], tetapi Anda bisa menggunakan karakter lain selama Anda mendekodekannya sama, dan tidak perlu berbagi dengan yang lain.
Saya sarankan hanya menulis pembantu Anda sendiri. Suka ini dari komentar di halaman manual php untuk base64_encode :
function base64_url_encode($input) {
return strtr(base64_encode($input), '+/=', '._-');
}
function base64_url_decode($input) {
return base64_decode(strtr($input, '._-', '+/='));
}
urlencode
seperti yang disarankan oleh jawaban rodrigo-silveira. Membuat dua fungsi baru untuk menghemat beberapa karakter dalam panjang url, itu seperti masuk ke rumah Anda melewati jendela alih-alih hanya menggunakan pintu.
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
,
harus dimasukkan ke urlencoded %2C
, saya sarankan menggunakan ._-
alih-alih -_,
seperti satu-satunya varian di en.wikipedia.org/wiki/Base64#Variants_summary_table yang membuat trailing =
@ joeshmo Atau alih-alih menulis fungsi pembantu, Anda bisa urlencode string base64 yang dikodekan. Ini akan melakukan hal yang sama persis dengan fungsi pembantu Anda, tetapi tanpa perlu dua fungsi tambahan.
$str = 'Some String';
$encoded = urlencode( base64_encode( $str ) );
$decoded = base64_decode( urldecode( $encoded ) );
/
karakter jika Anda meneruskannya bukan sebagai parameter GET, tetapi sebagai jalur di URL. Ini akan mengubah jalur Anda jika Anda tidak mengganti /
dengan yang lain di kedua sisi.
Catatan Pengantar Saya cenderung memposting beberapa klarifikasi karena beberapa jawaban di sini sedikit menyesatkan (jika tidak salah).
Jawabannya adalah TIDAK , Anda tidak bisa hanya melewatkan parameter yang disandikan base64 dalam string kueri URL karena tanda plus dikonversi ke SPACE di dalam array global $ _GET. Dengan kata lain, jika Anda mengirim test.php? MyVar = stringwith + sign to
//test.php
print $_GET['myVar'];
hasilnya adalah:
stringwith sign
Cara mudah untuk menyelesaikan ini adalah dengan cukup urlencode()
menggunakan string base64 Anda sebelum menambahkannya ke string kueri untuk keluar dari kode +, =, dan / karakter ke kode% ##. Misalnya, urlencode("stringwith+sign")
kembalistringwith%2Bsign
Saat Anda memproses tindakan, PHP menangani penguraian kode string secara otomatis saat mengisi $ _GET global. Sebagai contoh, jika saya mengirim test.php? MyVar = stringwith% 2Bergabung ke
//test.php
print $_GET['myVar'];
hasilnya adalah:
stringwith+sign
Anda tidak ingin urldecode()
string $ _GET yang dikembalikan karena + akan dikonversi menjadi spasi.
Dengan kata lain jika saya mengirim test.php yang sama ? MyVar = stringwith% 2Bsign ke
//test.php
$string = urldecode($_GET['myVar']);
print $string;
hasilnya tidak terduga:
stringwith sign
Akan aman untuk rawurldecode()
input, namun, itu akan berlebihan dan karena itu tidak perlu.
<br>
, jadi tidak perlu mengetik banyak HTML. Saya harap ini membantu, saya sedikit mengedit jawaban Anda untuk lebih meningkatkannya.
Iya dan tidak.
Charset dasar base64 dalam beberapa kasus mungkin berbenturan dengan konvensi tradisional yang digunakan dalam URL. Tetapi banyak implementasi base64 memungkinkan Anda untuk mengubah charset agar sesuai dengan URL yang lebih baik atau bahkan datang dengan satu (seperti Python urlsafe_b64encode()
).
Masalah lain yang mungkin Anda hadapi adalah batas panjang URL atau lebih tepatnya - kurangnya batas tersebut. Karena standar tidak menentukan panjang maksimal, browser, server, perpustakaan dan perangkat lunak lain yang bekerja dengan protokol HTTP dapat menentukan batasnya sendiri. Anda dapat melihat artikel ini: FAQ WWW: Berapa panjang maksimum URL?
Ini adalah encode base64url yang dapat Anda coba, hanya perpanjangan kode joeshmo di atas.
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));
}
Secara teori, ya, selama Anda tidak melebihi panjang string url dan / atau kueri maksimum untuk klien atau server.
Dalam praktiknya, berbagai hal bisa menjadi sedikit lebih rumit. Misalnya, ini dapat memicu HttpRequestValidationException di ASP.NET jika nilainya mengandung "on" dan Anda membiarkannya mengekor "==".
Untuk penyandian aman url, seperti base64.urlsafe_b64encode(...)
pada Python kode di bawah ini, berfungsi untuk saya untuk 100%
function base64UrlSafeEncode(string $input)
{
return str_replace(['+', '/'], ['-', '_'], base64_encode($input));
}
Ya, selalu aman. tentu saja base64 berisi:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
tetapi string yang disandikan base64 biasanya tidak memiliki +
. +
akan dikonversi menjadi ruang kosong, menghasilkan string yang salah diterjemahkan. /
aman dalam pasangan parameter get. =
selalu di akhir string yang disandikan base64 dan sisi server dapat menyelesaikan =
secara langsung.