Ukrywanie nazwy i ścieżki pobieranego pliku w PHP

Web Design Blog

Kategoria:
Programowanie

Data publikacji:
23 grudnia 2019

Autor:
Paweł Mansfeld

Ukrywanie nazwy i ścieżki pobieranego pliku w PHP

Kiedy udostępniamy pliki do pobrania, może nam zależeć aby ukryć przed klientem faktyczną ścieżkę prowadzącą do plików. Dzięki temu mamy pewność, że nikt nie będzie ściągał plików, które nie są dla niego przeznaczone (zmieniając przykładowo cyfrę w danym adresie URL).

Mając sklep z plikami PDF, sprytny użytkownik otrzymując link do pliku pliki/do_pobrania/1.pdf pobierze drugi za darmo zmieniając adres na pliki/do_pobrania/2.pdf.

Oczywiście jest to uproszczony przykład, ale nawet w przypadku hashowania nazw plików lub używania skomplikowanych kluczy w parametrach URL, zawsze jest potencjalne ryzyko, że użytkownik pobierze coś więcej niż przewidywaliśmy. Jest to jeszcze bardziej istotne kiedy tworzymy aplikację do hostingu plików, witrynę z dostępem premium, subskrypcjami lub sprzedajemy poszczególne pliki – i nie ważne czy jest to wideo, dźwięk czy dokumenty PDF. W tym przewodniku pokażę jak w aplikacji PHP ukryć przed klientem faktyczną ścieżkę a nawet samą nazwę pliku który właśnie pobiera.

Na początek, stwórzmy link, który będzie uruchamiał specjalny skrypt pobierz.php:

<a href="pobierz.php" target="_blank">Pobierz plik</a>

W momencie kliknięcia na link, dowolną metodą musimy przekazać do skryptu dane mówiące o tym o jaki plik nam chodzi. Jeżeli używamy bazy danych, może to być zmienna GET odwołująca się do numeru zamówienia lub faktyczną ścieżkę możemy ukryć za pomocą sesji na stronie, na której jest taki link. Przykładowo:

   $_SESSION["plik"] = pliki/123456789.pdf

Zawartość pliku pobierz.php może mieć następującą zawartość:

<?php 
 if(!isset($_SESSION)) {
      session_start();
 }
$plik = $_SESSION["plik"];
$nowa_nazwa = 'plik.pdf';
header("Content-type:application/pdf");
header("Content-Length: " . filesize($plik));
header('Content-Disposition: attachment; filename="'.$nowa_nazwa.'"');
readfile($plik);
exit;

Jak widać, najpierw deklarujemy typ pliku i jego wielkość. Przedostatnia funkcja readfile() jest odpowiedzialna za upload pliku do użytkownika.

Działanie z perspektywy użytkownika

Jeżeli w zmiennej plik będzie znajdowała się poprawna ścieżka do pliku, po kliknięciu na link, użytkownik będzie mógł pobrać niezmieniony plik bez zdradzania w jakim folderze jest zapisany oraz jak się faktycznie nazywa.

Ponieważ wszystko dzieje się po stronie serwera – nie ma możliwości aby użytkownik odgadł naszą konwencję nazywania plików i mamy pewność, że będzie mógł pobrać tylko to, co chcemy mu w danym momencie udostępnić. Zawartość zmiennej $plik jest widoczna tylko dla skryptu PHP.

Podsumowanie

Mam nadzieję, że ten prosty przewodnik pozwoli uzyskać funkcjonalność, jaką często można spotkać na stronach z płatnymi filmami 😉 lub w aplikacji, która przechowuje poufne dokumenty użytkowników w jednym folderze. To bardzo prosta technika na kontrolowanie czasowego dostępu, lub tworzenia linków które wygasają po określonym czasie bez złożonych mechanizmów polegających na uwierzytelnianiu.

Oceń artykuł na temat: Ukrywanie nazwy i ścieżki pobieranego pliku w PHP
Średnia : 4.7 , Maksymalnie : 5 , Głosów : 3