Rumah > pembangunan bahagian belakang > tutorial php > Mengapa membatalkan siri objek dalam PHP idea yang tidak baik?

Mengapa membatalkan siri objek dalam PHP idea yang tidak baik?

WBOY
Lepaskan: 2024-07-20 05:06:29
asal
768 orang telah melayarinya

Why is unserializing an object in PHP a bad idea?

Mensiri dalam PHP ialah satu cara untuk menukar objek PHP kepada rentetan. Rentetan ini boleh digunakan dalam pelbagai cara, seperti menyimpannya dalam pangkalan data atau menghantarnya ke fungsi lain. Dokumentasi PHP mengatakan ini berguna apabila menghantar nilai PHP tanpa kehilangan jenis dan strukturnya. Tetapi saya tidak pernah mengalami masalah itu sebelum ini. Mungkin saya tidak nampak.

<?php
$test = new User();
$test->name = "Denzyl";
echo serialize($test);
/// Output: O:4:"User":1:{s:4:"name";s:6:"Denzyl";}
Salin selepas log masuk

Jadi, mari kita hadam rentetan itu. O bermaksud Objek, dan nombor berikut ialah panjang nama objek. Dua huruf s bermaksud rentetan dan panjang nama rentetan itu.

Apabila anda perlu menukar rentetan kembali ke PHP, panggil fungsi unserialize dan hantar rentetan sebagai parameter.

Apabila mensiri objek, dua kaedah dipanggil secara automatik. __serialize() & __sleep(). Ini akan membolehkan pengarang kelas melakukan sesuatu sebelum menukar objek kepada rentetan.
Itu adalah straight to the point. Tetapi buat masa ini, mari fokus pada menyahsiri rentetan. Ini bermakna menukar rentetan kepada objek PHP sebenar yang boleh digunakan kemudian pada masa jalan dalam kod PHP anda.

<?php

$string = 'O:8:"User":1:{s:4:"name";s:6:"Denzyl";}';
echo unserialize($string)->name;
/// Output: Denzyl
Salin selepas log masuk

Fungsi yang sama juga digunakan untuk menyahsiri. Tetapi kali ini, dua kaedah ialah __unserialize() dan __wakeup().

Tetapi mengapa ia adalah idea yang tidak baik?

Menggunakan unserialize tanpa mengetahui ia boleh membawa kepada pelaksanaan kod jauh. Itulah sebabnya mereka berkata jangan pernah mempercayai input.
Katakan anda malas dan anda mempercayai input rawak, dan anda bergabung dengan objek bersiri supaya anda boleh
menukar nilai di dalam objek. BOOM, anda boleh digodam.

<?php
$username = $_GET['username'];
$serialized = 'O:8:"User":1:{s:4:"name";s:6:"' . $username . '";}';
Salin selepas log masuk

Saya tidak akan menerangkan cara menulis eksploit untuk sesuatu seperti ini. Sesetengah alatan boleh menjana muatan secara automatik untuk anda, dan anda boleh memanggil diri anda kiddie skrip (kita semua bermula di suatu tempat). Yang saya kenal ialah PHPGGC.

Untuk memahami eksploitasi, anda boleh membaca artikel OWASP.
Jika anda tidak mengetahui perkara ini sebelum ini, baca juga artikel OWASP yang lain tentang kelemahan

Saya tahu saya belum menjelaskan cara menulis eksploitasi. Saya tidak fikir saya boleh melakukan kerja yang lebih baik daripada artikel di internet. Tetapi kini anda tahu perkara ini dan anda boleh melakukan penyelidikan anda.

Bagaimana untuk mengelakkan daripada dieksploitasi?

Mengapa anda mahu menggunakan ini? Saya tidak tahu; Saya tidak memprogramkan cukup lama (~ 15 tahun) untuk berpeluang menyelesaikan masalah menggunakan serialize/unserialize.
Penyelesaian saya terlalu drastik. Jawapan yang mudah ialah. Jangan gunakannya dalam projek PHP saya.

Artikel ini adalah sebahagian daripada siri artikel dalam perjalanan saya menulis alat analisis statik untuk PHP yang boleh mengimbas projek besar-besaran dalam beberapa minit/saat. Dan cari peraturan
yang ingin dimiliki oleh pemaju dalam projek mereka. Pada masa menulis artikel ini, saya sedang mengusahakan peraturan untuk berhenti
orang daripada menggunakan unserialize, dan ia sepatutnya sedia untuk keluaran seterusnya. Ikuti projek supaya anda akan dimaklumkan apabila
Saya memutuskan untuk menulis lebih banyak peraturan.

Atas ialah kandungan terperinci Mengapa membatalkan siri objek dalam PHP idea yang tidak baik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan