2012-05-10 15 views
8

Co robię:Jak bezpiecznie przechowywać pliki na serwerze

I w zasadzie trzeba stworzyć stronę internetową zabezpieczoną stronę logowania napisany w PHP, że po zalogowaniu się, masz pasek wyszukiwania, który czyta liczby całkowite i dane są wysyłane do skryptu PHP, który pobiera obraz z numerem jako jego nazwą.

(będę przechowywać kilka tysięcy obrazów na tym serwerze mają być przeszukiwane - zdjęcia zapasy)

-

Co Potrzebuję pomocy:

z moich badań, ja zrozum, że "nie" używasz baz danych, takich jak MySQL, do przechowywania rzeczywistych obrazów ze względu na szybkość i nieefektywność. Jeśli nie przechowujesz go w bazie danych i pozostawisz go w systemie plików serwera zgodnie z sugestią, jeśli ktoś wpisze bezpośredni adres URL na pasku adresu, czy nie przyniesie go do plików na moim serwerze?

Jak się przed tym chronić? Nie widzę żadnych plików na moim serwerze, aby można było je wyświetlić bez udanego przejścia przez stronę logowania.

Dzięki za pomoc, wszelkie uwagi lub sugestie będą mile widziane. Jest to dla mnie ważne, ponieważ w przyszłości zostaną dodane bardziej złożone informacje.

+2

Możesz mieć katalog, który nie jest dostępny przez HTTP i możesz użyć skryptu php, który sprawdza, czy użytkownik jest zalogowany, a jeśli tak, odczytuje plik z określonego katalogu i wyświetla go. –

+0

Przeczytałem, aby pozostawić plik poza folderem "public_html". Czy byłoby to całkowicie niedostępne z http? W jaki sposób mój skrypt php miałby dostęp do plików? – DMor

+0

'public_html' jest zwykle katalogiem, z którego pliki są wyświetlane, podczas używania Apache z cPanel. Oznacza to, że gdy wpisujesz 'http: // twoja_witryna.com', dane są pobierane z'/var/www/nazwa_użytkownika/public_html'. Oznacza to również, że cokolwiek wpisujesz w adresie URL, '/ var/www/username' jest ** nie ** dostępne. Oznacza to również, że katalog, który tam utworzysz, taki jak '/ var/www/username/files' również nie będzie dostępny. Z twojego skryptu PHP będziesz miał do niego dostęp z czymś takim jak 'file_get_contents ('/ var/www/username/files/imagename.extension');'. –

Odpowiedz

6

zalecany sposób o f pobieranie plików za pośrednictwem PHP (lub dowolnego innego skryptu) za pomocą tak zwanego nagłówka odpowiedzi "X-Sendfile".

Skrypt PHP obsługuje uwierzytelnianie i po sprawdzeniu poprawności ustawi kilka nagłówków odpowiedzi wraz z "X-Sendfile", który mówi serwerowi WWW o dostarczeniu pliku; skrypt kończy się, a serwer internetowy przejmuje kontrolę.

Zobacz tutaj prosty przykład:

http://www.jasny.net/articles/how-i-php-x-sendfile/

+1

Zajmę się tym, dziękuję. – DMor

0

można zrobić to w ten sposób napisać zasób służyć w php jak ten

image.php?requestid=..... 

w tym pliku można uzyskać requestid i odczyt aktualnych link (lokalny link) z bazy danych, przeczytaj plik obrazu, a następnie dane wyjściowe do przeglądarka

$id = $_GET['requestid']; 
$link = get_local_link_from_id($id); // return /images/file1.png...... 
$data = file_get_contents($link); 
header('Content-Type', 'image/png'); 
echo $data; 

ale myślę, że nie powinno to zrobić, po prostu zmień nazwę pliku losowo i stworzyć wiele z nich ....

+0

Muszą zachować oryginalny numer, nie jest to mój system, ale na żądanie osoby, która mnie zatrudniła. A to jest wystarczająco bezpieczne? tak długo, jak mój skrypt PHP filtruje żądania, prawda? – DMor

+0

GET nigdy nie jest bezpieczny, nawet POST może nie wystarczyć dla bezpieczeństwa. – ilhnctn

+0

@ilis - jaki jest sens Twojego komentarza? GET i POST są metodami używanymi przez HTTP, są "niezabezpieczone" tylko w przypadku niewłaściwego użycia podczas interpretacji danych wprowadzanych przez użytkownika. –

1

to może być przesada za situtation, ale to jest, jak myślę o zrobieniu go na app Zajmuję:

pierwszy , istnieją 4 serwery, serwer WWW, serwer pośredni i serwer danych

, gdy ktoś wysyła żądanie do serwera WWW, serwer sieciowy łączy się z serwerem oprogramowania pośredniego i żąda pliku, przekazując dane uwierzytelniające użytkownika, takie jak klucz sesji i żądany plik. oprogramowanie pośredniczące łączy się z bazą danych i sprawdza poprawność sesji i uprawnień użytkowników do tego pliku. zwróci błąd, lub dane binarne, jeśli mają dostęp. jeśli wyłączysz buforowanie wyjściowe zarówno na serwerze WWW, jak i na serwerze oprogramowania pośredniego, możesz wysłać 100k bloków z serwera oprogramowania pośredniego na serwer sieciowy, a serwer WWW wypisze pierwszy blok podczas odbierania drugiego bloku.

sam plik może być przechowywana na serwerze bazy danych poprzez FTP, SFTP lub innego udostępniania plików

na pewno nie jest tak skuteczny jak za pomocą x-Sendfile, ale jeśli ktoś jest w stanie PWN serwer WWW, będą nadal nie mają dostępu do pliku - w scenariuszach powyżej będą. serwer sieciowy jest jedynym publicznym serwerem, więc pozostałe serwery powinny być połączone w sieci prywatnej.

można również wysyłać dane do serwera, który będzie szyfrowania szyfrowania/deszyfrowania danych rzeczywistych plików

jeśli ktoś ma jakieś pomysły, jak poprawić to, jestem zainteresowany.

+0

Interesujące, ale jest to zdecydowanie bardziej skomplikowane niż potrzebuję (ale jest to interesujące do przeczytania). Szczerze mówiąc nie wiedziałem o .htaccess w tym czasie i że może zablokować przeglądanie całego folderu. Już to zaimplementowałem. Mam formularz logowania HTML, który pobiera dane, wysyła je do skryptu przetwarzania, który sprawdza poprawność użytkownika, który po zweryfikowaniu wysyła użytkownika do strony wyszukiwania. użytkownik wprowadza element # i jest wysyłany do innego skryptu przetwarzania, który uzyskuje dostęp do bazy danych z numerem jako kluczem podstawowym, trzymając ścieżkę do pliku i inne informacje. Jeśli istnieje, ciągnie ścieżkę pliku – DMor

+0

folder obrazów jest chroniony przez .htaccess ("DENY FROM ALL"). Używam również SSL i przechowuję inne informacje dotyczące obrazu w bazie danych MySQL – DMor

Powiązane problemy