2012-02-13 32 views
5

Często mam do czynienia z negatywnymi komentarzami, kiedy chcę mieć wyjście zapisu skryptów PHP do pliku na serwerze.W jaki sposób pozwalasz, aby PHP zapisywało do pliku bez narażania bezpieczeństwa serwera?

używam funkcji fopen(), fwrite() i fclose().

Jedynym sposobem, w jaki wiem, jak to się stało, jest ustawienie uprawnień dla pliku wyjściowego na 0666 lub posiadanie go przez "nobody" (który jest użytkownikiem, który działa pod PHP na naszym serwerze WWW Apache).

Jeśli zatem "0666" lub "własność nikogo" stanowią zagrożenie dla bezpieczeństwa, w jaki sposób można skutecznie i bezpiecznie zezwolić skryptowi PHP na zapisanie pliku?

Dzięki za podzielenie się wskazówkami na ten temat.

+0

Proszę wyjaśnić, w jaki sposób "narażasz bezpieczeństwo serwerów", umożliwiając zapisanie własnego pliku przez skrypt. Czy pisanie do DB jest także zagrożeniem bezpieczeństwa? Upewnij się tylko, że Twój kod nie zawiera błędów bezpieczeństwa. Dopóki wszystko jest zrobione dobrze, wtedy nie ma problemów. – Flukey

+0

@Flukey ... na tym polega cel mojego pytania. Nie widzę wyraźnie problemu. Ale zawsze, gdy wspominam, że mam plik 0666 na serwerze lub plik należący do użytkownika, na którym działa PHP, otrzymuję komentarze, które idą w parze z ... "i oczywiście wiesz, że otwierasz swój serwer do ochrony ryzyko ". Po prostu chcę pisać efektywne skrypty bez uszczerbku dla bezpieczeństwa serwera. –

+1

Dopóki zapisywany plik znajduje się poza publicznym katalogiem Apache, nie widzę problemu. Ich komentarze są ignoranckie. – Flukey

Odpowiedz

3

Jeśli chcesz uzyskać dostęp do plików z PHP po ich przesłaniu, muszą być one przechowywane z uprawnieniami, które pozwalają serwerowi WWW (w tym przypadku apache) uzyskać do nich dostęp. Ryzyko, o którym ludzie mówią, polega na tym, że niektóre skrypty w twojej witrynie mogą zostać oszukane w celu udostępnienia pliku. Jest to hipotetyczne ryzyko, ale miało miejsce w przypadku wielu systemów zarządzania treścią. Aby zmniejszyć to ryzyko:

  1. Nie można łatwo zgadnąć nazwy pliku i ścieżki. Jeśli użytkownik ma ścieżkę do getfile.php?file=1.txt, może łatwo stwierdzić, że istnieje również 2.txt. Ukryj nazwę lub zmodyfikuj ją.
  2. Utwórz dowolny skrypt obsługujący pliki, potwierdzaj takie rzeczy, jak zalogowany użytkownik, autoryzacja do zasobu i usuń wszystko z nazwy pliku zawierającego ścieżkę, aby uniknąć fałszywych odwołań do /etc/passwd i tym podobnych.

Jeśli po prostu trzeba usunąć plik i nigdy go nie serwować lub uzyskać do niego dostęp za pośrednictwem PHP, masz więcej opcji. Użyj komend chmod lub chown, aby uczynić go nieczytelnym dla użytkownika apache. Jeśli chcesz być bardziej paranoikiem, poproś o skrypt cron, który przeniesie plik (i zmieni jego nazwę) na lokalizację nieznaną w źródle PHP. Przynajmniej wtedy, jeśli twój serwer zostanie zhakowany, intruz nie może wejść do katalogu, ale zbliżamy się do punktu, w którym dyskusja zmierza w kierunku bezpieczeństwa systemu operacyjnego.

+0

Dzięki @DuaneGran. Przeczytam twoją odpowiedź i przetrawię ją dokładniej wkrótce. Ale moją pierwszą reakcją jest to, co masz na myśli przez "Hash the name"? I jak to zrobić i użyć go w scenariuszu? –

+0

@ Dr.DOT Mylę się sugerować mieszania, ponieważ jest to jeden sposób. Mój błąd. Tak się składa, że ​​to ostatnie pytanie zawiera odpowiedzi na temat łatwych funkcji deszyfrowania/odszyfrowania, które działałyby dla nazwy pliku: http://stackoverflow.com/questions/9262109/php-simplest-two-way-encryption –

-1

Istnieje ryzyko, że ten zapisalny katalog znajduje się w obszarze dostępnym dla świata zewnętrznego. Następnie ci z odpowiednimi narzędziami i wiedzą, jak napisać cokolwiek chcą do tego katalogu ... lub pliku. Następnie mogą umieścić w nim złośliwe oprogramowanie lub utworzyć system phishingowy w witrynie.

Naprawdę mogą zrobić różne rzeczy, aby cię złamać. Widziałem to na własnych serwerach i tak naprawdę nie znalazłem odpowiedniego rozwiązania.