Rozdział 10. Odbieranie plików od użytkownika
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.