2012-05-24 22 views
8

Pracuję nad stworzeniem strony internetowej, która umożliwia klientom logowanie się i wyświetlanie różnych PDFs zapisanych na serwerze. Te pliki PDF będą unikatowe dla klienta i nie powinny być dostępne dla osób, które nie są zalogowane. Dostarczanie plików na serwer nie powinno stanowić problemu, po prostu nie wiem, jak je udostępnić użytkownikom końcowym.Tworzenie bezpiecznego serwera hostingu dla plików PDF

Wprowadziłem tego rodzaju rzeczy z danymi z SQL servers, które są wyświetlane zamiast plików, więc nie jestem całkowicie pewien, co jest najbardziej skutecznym sposobem, aby to osiągnąć.

Strona znajduje się na LAMP, a moje minimalne doświadczenie jest w PHP (ale jeśli framework lub inny język ułatwiłby to, mogę się go nauczyć).

Jestem prawdopodobnie w mojej głowie, ale zwykle jestem, więc wszelkie dane wejściowe będą świetne.

Odpowiedz

9

Umieść pliki poza katalogiem WWW. Następnie za pomocą PHP przekaż plik za pomocą skryptu. W ten sposób nikt nie może bezpośrednio połączyć się z plikiem i ominąć twoich kontrolek. (Oczywiście upewnij się, że skrypt, który robi to tylko po sprawdzeniu, czy użytkownik ma uprawnienia do pobierania tego pliku).

Próbka PHP:

<?php 
    session_start(); 
    if (!isset($_SESSION['authenticated'])) { 
     exit; 
    } 
    $file = '/path/to/file/outside/www/secret.pdf'; 

    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename=' . basename($file)); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
    exit; 
?> 
+0

Gdyby nie 'session_start();' być załadowany? Rozumiem, że ma działać z sesjami. –

+0

Właściwie tak, tak powinno być. Byłem tak skoncentrowany na głównej koncepcji, że nie przedstawiłem naprawdę kompletnego przykładu. Naprawię to teraz ... –

+0

Po prostu sprawdzam ;-) –

4

Łatwym sposobem jest dać te pliki długie losowe nazwy plików (powiedzmy, 20 losowych znaków). Technicznie będą dostępne dla każdego, ale nie będzie można odgadnąć adresu URL, więc tylko upoważnione osoby będą miały dostęp.

Alternatywnie John Conde już nakreślił sposób obsługi pliku ze skryptu PHP. Spowoduje to niewielką karę wykonania, ale będzie tak samo bezpieczny jak twój kod. Jedyne, co mogę dodać, to to, że jeśli nie możesz ich umieścić poza serwisem internetowym, możesz użyć .htaccess, aby uniemożliwić użytkownikom bezpośredni dostęp do plików.

+1

Sugerowałbym GUID. Wciąż mam problem z tym, że mogę wysłać ping do serwera, dopóki nie otrzymam czegoś interesującego, chociaż szanse na sukces będą znikome. Wspieram użycie .htaccess w celu zablokowania dostępu do folderu. – zebediah49

+1

@ zebediah49 - Jest to możliwe, ale [są pułapki] (http://blogs.msdn.com/b/oldnewthing/archive/2012/05/23/10309199.aspx), o których powinieneś wiedzieć. Po prostu generowanie losowego ciągu jest bezpieczniejsze. A jeśli chcesz mieć 110% pewności, użyj silnego kryptografu generatora liczb losowych. –

+0

Bardzo interesujące, dzięki. Wybrałem GUID na długość, ale nadal unikałbym korzystania z publicznie dostępnych adresów URL, ale to bardzo dobry punkt. – zebediah49

2

John opublikował podstawowy prawidłowy sposób wykonania tej czynności, więc dodaję (prawdopodobnie gorszą) alternatywę: podaj ją z bazy danych. Wystarczy mieć kolumnę BLOB dla pliku PDF i odczytać/zapisać dane pliku z bazy danych. Będziesz miał dość duży stół, ale zadziała. Aby go obsłużyć, trzeba ustawić to samo, co John, wysyłając dane z bazy danych zamiast z pliku.

Ma to tę zaletę, że nie trzeba upewnić się, że nie ma kolizji nazw plików itp