2012-08-01 11 views
7

Obecnie pracuję na stronie internetowej, gdzie użytkownicy mogą przesyłać pliki. Jak mogę zapobiec przesyłaniu dużych plików? W tamtym czasie żadna opcja (PHP post_max_size i upload_max_filesize) nie była przydatna: plik jest w całości przesyłany. Po prostu chciałbym, żeby połączenie zostało zamknięte zbyt dużymi plikami (sprawdzając wcześniej nagłówek HTTP Content-Length i sprawdzając, kiedy plik jest przesyłany). Czy istnieje dyrektywa Apache lub klucz konfiguracyjny PHP?Zamknij połączenie Apache ze zbyt dużym ładowaniem plików

Dziękuję za poświęcony czas!

EDYCJA: dodano Apache conf (domyślne ustawienie CentOS).
EDIT2: dodano również PHP conf (domyślnie CentOS).

EDIT3: Wygląda na to, że PHP zamyka potok, gdy podano mu zbyt duży plik. Niemniej Apache nadal zezwala na transfer do końca.

+0

http://stackoverflow.com/questions/4738691/php-bulk-post-500-apache-internal-server-error/4739476#4739476, sprawdź parametry tej odpowiedzi – regilero

+0

Wypróbowaliśmy wszystkie z wyjątkiem czasu te powiązane: nie chcemy uzależniać prędkości połączenia. W każdym razie PHP wydaje się nie być problemem, to raczej Apache. – Iso

+0

Jak podano w linku, a odpowiedź @PhpMyCoder ma limit LimitRequestBody w ustawieniach Apache. – regilero

Odpowiedz

2

Ok.

więc głównym problemem stoją jest to, że dyrektywa Apache LimitRequestBody lub LimitXMLRequestBody są stosowane po zakończeniu przesyłania. Wygląda na to, że apache czeka na kompletny plik w folderze tymczasowym, zanim sprawdzi rozmiar.

Musisz więc wyłączyć połączenie zaraz po wykryciu zbyt dużego pliku. Pojedynczo mod_throttle był dostępny moduł do tego. Sprawdzając ten Alternative to mod_throttle servfault question możesz mieć listę modułów sterowania pasmem, które mogą pasować do twoich potrzeb.

mod_bwshare na przykład jest w stanie ograniczyć przepustowość na adres IP klienta, ale nie jest to limit per_IP na żądanie. Istnieje również mod_quos, obsługujący wiele ograniczeń dotyczących rzeczy do pobrania, ale nie mogę znaleźć wielu rzeczy do zarządzania przesyłaniem (tylko zamykanie wczesnego powolnego przesyłania może być). Zobacz także this answer on throttling uploads.

Więc może również sprawdzić poziom OS ograniczenia (na stosie TCP) lub zaawansowaną zaporę zdolności (poprosić o servfault).

Można również użyć narzędzi ograniczających po stronie klienta, takich jak ukryte wartości formularzy lub ustawienia js uploader, ale jak wszystko, co jest używane po stronie klienta, pod względem bezpieczeństwa nie można uniknąć sytuacji, w której ktoś zmienia ograniczenia po stronie klienta.

2

Możesz użyć apache'a LimitRequestBody. Składnia jest prosta (w bajtach):

LimitRequestBody 10490000 # 10 MB 

Działa to zarówno httpd.conf i .htaccess, po prostu pamiętać, aby ponownie uruchomić, jeśli edytować httpd.conf (sudo service apache2 restart na Ubuntu).

Jeśli trzeba ustawić ograniczenia dla każdego pliku (limit awatar przesłać do 5 MB, ale dopuszczalne załączniki do 20 MB), można użyć <Files>:

<Files avatarUpload.php> 
    LimitRequestBody 5242880 # 5 MB 
</Files> 

<Files attachmentUpload.php> 
    LimitRequestBody 20971520 # 20 MB 
</Files> 
+2

Przetestowaliśmy to również; Niestety, plik jest w całości przesłany, a Apache odrzuca połączenie. – Iso

+0

Naprawdę? Następnie powinieneś złożyć raport o błędzie w Apache - to wyraźnie przeczy temu, co ta funkcja ma zamiar zrobić (tj. Jestem bardzo podejrzliwa wobec twojej metodologii) – symcbean

+0

Dobra ... :) – Baba

Powiązane problemy