Mengekalkan Integriti Direktori dalam PHP: Mencegah Traversal Direktori sambil Membenarkan Laluan
Dalam bidang pembangunan web, melindungi input pengguna daripada percubaan berniat jahat adalah terpenting. Satu kebimbangan sedemikian timbul apabila memproses laluan dalam PHP, khususnya apabila cuba mengehadkan traversal direktori sambil menampung laluan relatif.
Pertimbangkan senario berikut: anda mempunyai laluan asas "/whatever/foo/" dan ingin membenarkan pengguna untuk menentukan laluan berbanding dengannya menggunakan $_GET['path']. Walau bagaimanapun, anda mesti menghalang mereka daripada mengeksploitasi kelemahan seperti mengakses fail di luar direktori yang dimaksudkan.
Kaedah tradisional seperti mencari urutan seperti "..." dan ".." dalam laluan yang disediakan pengguna adalah tidak mencukupi, kerana ia boleh dipintas. Nasib baik, penyelesaian yang lebih mantap wujud.
Memanfaatkan Laluan Nyata dengan realpath()
Untuk menghalang traversal direktori dengan berkesan sambil membenarkan laluan relatif, pertimbangkan untuk menggunakan realpath(). Fungsi ini menyelesaikan laluan tertentu ke lokasi fizikal mutlaknya, pemfaktoran dalam symlinks, "." dan rujukan ".." dan direktori maya lain.
Coretan kod berikut menggambarkan pendekatan ini:
$basepath = '/foo/bar/baz/'; $realBase = realpath($basepath); $userpath = $basepath . $_GET['path']; $realUserPath = realpath($userpath); if ($realUserPath === false || strpos($realUserPath, $realBase) !== 0) { //Directory Traversal! } else { //Good path! }
Pertama sekali, $realBase diperoleh dengan menggunakan realpath() pada laluan asas , memastikan ia menggambarkan lokasi fizikalnya dengan tepat. Seterusnya, $realUserPath ditentukan dengan menggabungkan laluan asas dan laluan yang disediakan pengguna, diikuti dengan menyelesaikan laluan fizikal sebenar menggunakan realpath().
Secara penting, kami membandingkan $realUserPath dengan $realBase. Jika $realUserPath bersamaan dengan palsu (menunjukkan laluan tidak sah atau tidak wujud), atau jika ia tidak bermula dengan $realBase, percubaan melintasi direktori dikenal pasti. Sebaliknya, jika $realUserPath memulakan dengan $realBase, ia menandakan laluan yang dibenarkan.
Dengan menggunakan realpath(), anda memperoleh kaedah yang boleh dipercayai untuk menghalang traversal direktori sambil membenarkan laluan relatif dalam PHP, dengan berkesan melindungi aplikasi anda daripada hasad masukkan dan pelihara integriti struktur direktori anda.
Atas ialah kandungan terperinci Bagaimanakah PHP Boleh Menghalang Traversal Direktori Semasa Membenarkan Laluan Relatif?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!