realpath
funkcja
Rozwiązuje wszystkie dowiązania symboliczne i normalizuje ścieżkę do bezwzględnej. Zwraca string lub false gdy ścieżka nie istnieje.
realpath(string $path): string|false
realpath przekształca podaną ścieżkę (względną, zawierającą .. lub dowiązania symboliczne) na bezwzględną, kanoniczną ścieżkę w systemie plików. Jeśli ścieżka nie istnieje lub brak uprawnień do jej sprawdzenia, funkcja zwraca false. To kluczowe narzędzie do walidacji ścieżek — po wywołaniu realpath możesz sprawdzić, czy wynikowa ścieżka zaczyna się od oczekiwanego katalogu bazowego, co skutecznie blokuje ataki path-traversal.
Bezpieczeństwo: zawsze porównuj wynik realpath z katalogiem bazowym aplikacji, zanim użyjesz ścieżki pochodzącej od użytkownika — to najprostszy i najskuteczniejszy sposób obrony przed path-traversal.
<?php
declare(strict_types=1);
$katalogBazowy = realpath(__DIR__ . '/pliki');
if ($katalogBazowy === false) {
http_response_code(500);
exit('Błąd konfiguracji');
}
$zadanaSciezka = $_GET['plik'] ?? '';
// Rozwiązujemy ścieżkę bez sprawdzania istnienia pliku (łączymy i wywołujemy realpath)
$pelnaSciezka = realpath($katalogBazowy . '/' . $zadanaSciezka);
if ($pelnaSciezka === false || !str_starts_with($pelnaSciezka, $katalogBazowy . '/')) {
http_response_code(403);
exit('Dostęp zabroniony.');
}
echo file_get_contents($pelnaSciezka);