PHP - Filtered unserialize()

Pengenalan

Halo! Selamat datang ke perjalanan kita dalam dunia pemrograman PHP. Hari ini, kita akan mendalamkan topik yang bisa sia-sia dan sedikit menakutkan bagi pemula: unserialize() dengan filter. Tetapi jangan khawatir, saya akan mengarahkan Anda langkah demi langkah, memastikan Anda mengerti segala sesuatu sepanjang jalan.

PHP - Filtered unserialize()

Apa itu serialisasi?

Sebelum kita masuk ke unserialize(), mari pertama-tama mengerti apa itu serialisasi. Serialisasi adalah proses konversi objek atau struktur data menjadi format yang dapat disimpan atau dikirim dan kemudian direkonstruksi kemudian. Di PHP, ini biasanya dilakukan menggunakan fungsi serialize().

$data = array('a', 'b', 'c');
$serialized_data = serialize($data);
echo $serialized_data; // Outputs: a:3:{i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";}

Dalam contoh di atas, kita memiliki array $data yang di serialisasikan menjadi string menggunakan serialize(). String yang dihasilkan kemudian dapat disimpan di basis data atau dikirim melalui jaringan.

Apa itu unserialisasi?

Unserialisasi adalah proses terbalik dari serialisasi. Itu mengambil string yang di serialisasi dan mengkonversinya kembali ke bentuk aslinya. Di PHP, ini dilakukan menggunakan fungsi unserialize().

$serialized_data = 'a:3:{i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";}';
$data = unserialize($serialized_data);
print_r($data); // Outputs: Array ( [0] => a [1] => b [2] => c )

Dalam contoh ini, kita mengambil string yang di serialisasi $serialized_data dan mengkonversinya kembali ke array menggunakan unserialize().

Apa itu filter?

Sekarang, mari bicarakan tentang filter. Saat Anda bekerja dengan data yang di unserialisasi, penting untuk memastikan bahwa data itu aman dan valid. Ini adalah tempat filter memainkan perannya. Filter memungkinkan Anda menentukan aturan tambahan tentang bagaimana data harus ditangani saat unserialisasi.

Ada dua jenis filter utama yang tersedia di PHP:

  1. Opsi: Ini digunakan untuk mengontrol perilaku unserialize(). Misalnya, Anda dapat menggunakan opsi UNSERIALIZE_THROW_ON_INVALID untuk melempar pengecualian jika data tidak dapat di unserialisasi.
  2. Callback: Ini adalah fungsi yang ditentukan pengguna yang dapat digunakan untuk melakukan validasi atau transformasi khusus pada data yang di unserialisasi.

Menggunakan filter dengan unserialize()

Sekarang kita telah mengetahui dasar-dasar, mari lihat bagaimana kita dapat menggunakan filter dengan unserialize(). Kita akan mulai dengan filter opsi.

Filter Opsi

Opsi UNSERIALIZE_OPTIONS memungkinkan Anda menentukan flag tambahan yang mengontrol perilaku unserialize(). Ini adalah contoh:

$serialized_data = 'a:3:{i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";}';
$options = ['options' => ['allowed_classes' => false]];
$data = unserialize($serialized_data, $options);

Dalam contoh ini, kita telah mengatur opsi allowed_classes ke false, yang berarti hanya kelas native PHP yang akan diizinkan untuk di unserialisasi. Jika data yang di serialisasi mengandung kelas lain, kesalahan akan dilempar.

Filter Callback

Filter callback adalah fitur yang lebih lanjut yang memungkinkan Anda mendefinisikan logika validasi atau transformasi sendiri. Ini adalah contoh:

function my_callback($class, $data, $filter) {
if ($class === 'MyClass') {
return new MyClass($data);
}
return false;
}

$serialized_data = 'O:8:"MyClass":1:{s:4:"name";s:5:"Alice";}';
$data = unserialize($serialized_data, ['callback' => 'my_callback']);

Dalam contoh ini, kita telah mendefinisikan fungsi callback my_callback() yang memeriksa jika kelas yang di unserialisasi adalah MyClass. Jika itu benar, itu membuat instance baru MyClass dengan data yang diberikan. Jika tidak, itu mengembalikan false, yang akan menyebabkan unserialize() gagal.

Kesimpulan

Wah! Itu adalah perjalanan yang cukup, kan? Saya harap Anda sekarang memiliki pemahaman yang baik tentang serialisasi, unserialisasi, dan bagaimana menggunakan filter dengan unserialize() di PHP. Ingat, latihan membuat sempurna, jadi cobalah konsep ini dengan data contoh. Dan jangan lupa untuk bersenang-senang saat melakukannya!

Credits: Image by storyset