Rumah > pembangunan bahagian belakang > tutorial php > Bagaimanakah PHP Boleh Menghalang Traversal Direktori Semasa Membenarkan Laluan Relatif?

Bagaimanakah PHP Boleh Menghalang Traversal Direktori Semasa Membenarkan Laluan Relatif?

Barbara Streisand
Lepaskan: 2024-12-05 02:01:07
asal
917 orang telah melayarinya

How Can PHP Prevent Directory Traversal While Allowing Relative Paths?

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!
}
Salin selepas log masuk

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!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan