Jak wspomniano wczeÅ›niej, PHP „umie” odbierać pliki od użytkownika. Robi siÄ™ to przy pomocy pola typu „file” w formularzu i odpowiednich zmiennych w skrypcie odbierajÄ…cym dane.
Przykład 10.1. Odbieranie pliku od użytkownika
plik1.html: <html> <body> <form action="plik2.php" method="POST" ENCTYPE="multipart/form-data"> <input type="file" name="plik"/><br/> <input type="submit" value="Wyślij plik"/> </form> </body> </html> plik2.php: <?php $max_rozmiar = 1024*1024; if (is_uploaded_file($_FILES['plik']['tmp_name'])) { if ($_FILES['plik']['size'] > $max_rozmiar) { echo 'Błąd! Plik jest za duży!'; } else { echo 'Odebrano plik. Początkowa nazwa: '.$_FILES['plik']['name']; echo '<br/>'; if (isset($_FILES['plik']['type'])) { echo 'Typ: '.$_FILES['plik']['type'].'<br/>'; } move_uploaded_file($_FILES['plik']['tmp_name'], $_SERVER['DOCUMENT_ROOT'].'/foto/'.$_FILES['plik']['name']); } } else { echo 'Błąd przy przesyłaniu danych!'; } ?>
PrzesyÅ‚anie plików na serwer jest sprawÄ… dosyć niebezpiecznÄ…, dlatego należy odpowiednio siÄ™ zabezpieczyć. W powyższym przykÅ‚adzie użyta zostaÅ‚a funkcja is_uploaded_file(). Sprawdza ona czy podany plik faktycznie zostaÅ‚ odebrany od użytkownika – sprawdzenie takie jest istotne, gdyż w przypadku źle napisanego skryptu „wÅ‚amywacz” bÄ™dzie mógÅ‚ odczytać z serwera dowolny plik, do którego prawo odczytu posiada użytkownik jako który pracuje serwer WWW.
Po kolei wykorzystywane są dostępne informacje o pliku. Jeśli wszystkie próby przebiegną pomyślnie, plik jest przenoszony w docelowe miejsce przy pomocy funkcji move_uploaded_file(). Oczywiście jeśli plik o takiej samej nazwie już istnieje, zostanie nadpisany, dlatego też należy najpierw to sprawdzić przy pomocy funkcji file_exists(), ale o tym w następnym rozdziale.
Kolejnym niebezpieczeÅ„stwem jest możliwość wstawienia na serwer skryptu PHP zawierajÄ…cego „niebezpieczne instrukcje”. Można siÄ™ przeciw temu zabezpieczyć sprawdzajÄ…c rozszerzenie lub typ przesyÅ‚anego pliku. JeÅ›li rozszerzenie pliku to .php (lub inne, które jest przetwarzane przez serwer WWW jako skrypt PHP) lub typ pliku jest inny od oczekiwanego (na przykÅ‚ad wszystkie inne niż image/gif czy image/jpeg), plik można albo usunąć albo zmienić mu rozszerzenie. Jak – opis w nastÄ™pnym rozdziale.
Aby plik mógł zostać przeniesiony w docelowe miejsce, docelowy katalog musi mieć odpowiednie prawa dostępu. Mianowicie użytkownik, jako który pracuje serwer WWW musi mieć prawo zapisu do tego katalogu. Wszystkie niezbędne informacje można uzyskać od administratora serwera, lub szukając dyrektywy User w pliku /etc/httpd/httpd.conf.