Pustaka VirtualPath
menormalkan jalur dan mencegah serangan traversal direktori tanpa menanyakan sistem file.
Disarankan untuk menggunakan Composer manajer ketergantungan untuk menginstal rayne/virtual-path
.
composer require rayne/virtual-path
Kelas VirtualPath
menormalkan input ke virtual path absolut tanpa menanyakan sistem file apa pun. Ini juga mendeteksi dan menandai serangan traversal direktori.
Kelas JailedPath
menggunakan VirtualPath
untuk membangun jalur aman yang dapat digunakan untuk bekerja dengan file nyata. Normalisasi dilakukan relatif terhadap jalur yang disebut jail
yang digunakan sebagai root virtual untuk setiap jalur yang dimasukkan oleh pengguna. Karena JailedPath
tidak menanyakan sistem file, JailedPath cocok untuk bekerja dengan jalur lokal, jarak jauh, atau fiksi.
Silakan baca bagian Detail Implementasi untuk lebih jelasnya.
TL;DR Gunakan kelas JailedPath
jika ragu.
JailedPath
Dalam contoh ini pengunjung situs web diperbolehkan mengunduh file apa pun dari direktori lokal /test
dengan menentukan jalur relatif sebagai parameter GET
. Untuk mencegah pengguna meninggalkan direktori dengan serangan traversal direktori, JailedPath
digunakan dengan /test
sebagai direktori root virtual.
<?php
use Rayne VirtualPath JailedPath ;
$ jailedPath = new JailedPath ( ' /test ' , $ _GET [ ' path ' ] ?? '' );
if ( $ jailedPath -> hasJailbreakAttempt ()) {
// Log jailbreak attempt, ban user, …
return ;
}
if ( is_file ( $ jailedPath -> getAbsolutePath ())) {
@ readfile ( $ jailedPath -> getAbsolutePath ());
}
Tabel berikut menunjukkan bagaimana jalur yang ditentukan pengguna dinormalisasi dan bagaimana jalur tersebut diinterpretasikan relatif terhadap root virtual.
Masukan Pengguna | hasJailbreakAttempt() | getAbsolutePath() | getRelativePath() |
---|---|---|---|
Tali Kosong | false | /test | Tali Kosong |
. | false | /test | Tali Kosong |
a.png/../b.png | false | /test/b.png | b.png |
/a/./b | false | /test/a/b | a/b |
.. | true | /test | Tali Kosong |
../example | true | /test/example | example |
../etc/passwd | true | /test/etc/passwd | etc/passwd |
Himpunan | true | /test | Tali Kosong |
VirtualPath
Jika awalan tetap atau lapisan gula JailedPath
tidak diperlukan, maka VirtualPath
sudah cukup karena merupakan kelas yang digunakan untuk normalisasi jalur. VirtualPath
menormalkan input dan menyediakan jalur tepercaya (dinormalisasi, dengan awalan /
) dan tidak tepercaya (representasi string dari input pengguna yang mungkin berbahaya).
Contoh sebelumnya dapat dengan mudah dibuat ulang dengan VirtualPath
ketika instance VirtualPath
(yang dapat dilemparkan (string)
) ditambahkan ke direktori root virtual.
<?php
use Rayne VirtualPath VirtualPath ;
$ path = new VirtualPath ( $ _GET [ ' path ' ] ?? '' );
$ absolutePath = ' /test ' . $ path ;
Tergantung pada skenario penggunaan, kadang-kadang berguna untuk bekerja dengan jalur tepercaya yang dinormalisasi bahkan jika masukan asli tidak dapat dipercaya, misalnya ketika secara eksplisit mendukung jalur relatif dan memberikan pengguna keraguan ketika secara tidak sengaja mencoba mengakses file di luar virtual path .
Catatan : VirtualPath
mengembalikan jalur yang dinormalisasi dengan /
di depannya. Saat bekerja dengan file, disarankan untuk menambahkan jalur tepercaya sebagai awalan (lihat contoh kode di bagian saat ini) karena jika tidak, file yang berhubungan dengan root sistem file akan direferensikan. Agar tidak lupa menambahkan awalan, gunakan kelas JailedPath
saat bekerja dengan file nyata.
Masukan | isTrusted() | getTrustedPath() | getUntrustedPath() |
---|---|---|---|
Himpunan | false | / | Tali Kosong |
Tali Kosong | true | / | Tali Kosong |
../articles | false | /articles | ../articles |
tags/../../articles | false | /articles | tags/../../articles |
tags/../articles | true | /articles | tags/../articles |
../etc/passwd | false | /etc/passwd | ../etc/passwd |
/etc/passwd | true | /etc/passwd | /etc/passwd |
etc/passwd | true | /etc/passwd | etc/passwd |
Menggunakan jalur normalisasi virtual murni memiliki manfaat berbeda:
Normalisasi jalur dilakukan tanpa menanyakan sistem file
Tidak mungkin melakukan serangan pengaturan waktu untuk file di luar cakupan virtual path
Tidak diperlukan perbandingan rumit untuk membatasi penjelajahan direktori ke direktori tertentu dan turunannya
Hanya .
, ..
, (dinormalisasi menjadi
/
) dan /
diinterpretasikan untuk normalisasi jalur
Tidak ada informasi yang tidak terduga dan bocor ~
perluasan seperti yang terlihat di perpustakaan lain
Implementasi VirtualPath
tidak menafsirkan, mengubah atau menghapus karakter kontrol dan Unicode:
Jalur direktori dan file diperbolehkan berisi karakter kontrol pada beberapa sistem
Menghapus karakter kontrol berada di luar cakupan perpustakaan
Kloning repositori
git clone https://github.com/rayne/virtual-path.git
Instal dependensi pengembangan
composer install --dev
Jalankan tes
composer test