2010-08-12 8 views
8

Używam planu hostingowego GoDaddy na platformie Windows. To nie był mój wybór - ma to związek z inną częścią rzeczywistej strony przy użyciu ASP.NET (także nie mój wybór).Ograniczaj dostęp do pliku - czytaj tylko przez PHP

Mam bazę danych SQL zawierającą kilka pozycji z pewnymi nieczułymi informacjami o klientach. Kluczem podstawowym jest liczba całkowita AutoIncment i mam serię plików PDF, które pasują do każdej z tych liczb całkowitych (np. 555.pdf, 7891.pdf itd.).

Moim celem jest ograniczenie bezpośredniego dostępu do tych plików, chcę, aby użytkownicy musieli najpierw przejść proces wyszukiwania i logowania (PHP). Pierwotnie planowałem umieścić pliki powyżej folderu PUBLIC_HTML, ale GoDaddy odmawia przyznania mi uprawnień administratora bez dedykowanego serwera (20 USD miesięcznie od nich).

Następną rzeczą, na którą spojrzałam, była HTACCESS. Zamierzałem ograniczyć dostęp do plików tylko do skryptów PHP, pozwalając tylko na dostęp do adresu IP serwera (lub localhost/127.0.0.1). Niestety to nie działa, ponieważ GoDaddy nie uruchamia Apache na swoich serwerach Windows.

Mogę umieścić pliki w obiektach BLOB w bazie danych, ale to staje się naprawdę niepotrzebne, gdy muszę szybko z nimi pracować (plus miałem pewne problemy z tym podejściem).

Wszelkie sugestie, aby ograniczyć dostęp do plików tylko do skryptu PHP (readfile())?

+0

To będzie zależeć od serwera internetowego, którego używają (IIS, przypuszczam). Może powinieneś oznaczyć to tagiem IIS. – Artefacto

Odpowiedz

5

Ponieważ nie można umieścić w dowolnym miejscu, ale pliki w katalogu public_html, musisz iść do obawiano/znienawidzonego „bezpieczeństwo poprzez ukrywanie” metoda

  1. Utwórz losowo nazwie podkatalogu do przechowywania plików w: public_html/RANDOMGARBAGE

  2. Upewnij się, że katalog nie jest dostępny do przeglądania. Wyłącz przeglądanie katalogów (jeśli możesz) i umieść tam także dokument domyślny (index.html?), Więc nawet jeśli przeglądanie jest włączone, nie otrzymasz wykazu katalogu.

  3. Nie przechowuj swoich plików z domyslnymi nazwami. Zamiast zapisywania ich przy pomocy identyfikatora bazy danych, przechowuj je z soloną i zakodowaną nazwą: $crypted_filename = sha1($real_filename . 'some hard-to-guess salt text'); (oczywiście, aby było to bardziej złożone, jeśli musisz). Zapisz oryginalną nazwę pliku w bazie danych. Więc skończyć z czymś takim:

    public_html/RANDOMGARBAGE/5bf1fd927dfb8679496a2e6cf00cbe50c1c87145 public_html/RANDOMGARBAGE/7ec1f0eb9119d48eb6a3176ca47380c6496304c8

  4. służyć do plików za pomocą skryptu PHP - nie odwołuje się do nazwy pliku hashed bezpośrednio

    Pobierz

który następnie ma:

<?php 

    $fileID = (int)$_GET['fileID']; 

    $crypted_file = sha1($fileID . 'some hard-to-guess salt text'); 

    $full_path = 'public_html/RANDOMGARBAGE/' . $crypted_file; 
    if (is_readable($full_path)) { 
     if(user_is_allowed_to_see_this_file()) { 
      /// send file to user with readfile() 
      header("Content-disposition: attachment; filename=$ORIGINAL_FILENAME"); 
      readfile($full_path); 
     } else { 
      die("Permission denied"); 
     } 
    } else { 
     /// handle problems here 
     die("Uh-oh. Can't find/read file"); 
    } 

W ten sposób użytkownik nigdy nie zobaczyć, co „s00per seekrit” nazwa_pliku jest, oni po prostu uważają, że ich przeglądarka hit ...php?fileID=37 i rozpocząć pobieranie secret file.pdf

Oprócz tego, można od czasu do czasu zmieniać nazwy specjalnej sub- katalog do czegoś innego na bieżąco, a także zmień tekst na sól (co wymaga aktualizacji wszystkich zaszyfrowanych nazw plików o nowe wartości sha1).

0

Możesz po prostu je ukryć. Jest to zabezpieczenie przez nieprzejrzystość, ale brzmi jak najlepsza opcja, jeśli nie możesz ich powstrzymać przed rootem internetowym lub znaleźć sposób na poinformowanie serwera, by nie obsługiwał ich bezpośrednio.

Tak trzymać je w jakimś losowo nazwie katalogu:

asd8b8asd8327bh/123.pdf 
asd8b8asd8327bh/124.pdf 
asd8b8asd8327bh/125.pdf 
... 

Następnie napisać sobie trochę skrypt PHP, który będzie wysyłał odpowiednie nagłówki i przekazać zawartość pliku przez.

na przykład:

<?PHP 
//pdf.php 
$id = $_GET['id']; 

//make sure nobody is doing anything sneaky. is_numeric() might do the trick if the IDs are always integers. 
if (!some_validation_passes($id)){ 
    die(); 
} 
<?php 

header('Content-type: application/pdf'); 
header('Content-Disposition: attachment; filename="'.$id.'.pdf"'); 
readfile('asd8b8asd8327bh'.$id.'pdf'); 

Teraz powyżej naprawdę nie ma lepszego niż tylko obsługujących pliki bezpośrednio (jeszcze), ponieważ ludzie mogą jeszcze zwiększyć parametr ID w ciągu kwerendy.

Ale powinieneś być w stanie dowiedzieć się, jak obsługiwać autoryzację dość łatwo.

+0

To jest bezpieczeństwo przez zapomnienie. Innymi słowy, nie jest bezpieczne. – Borealid

+0

@Borealid Mówisz tak, jakbym nie zakwalifikował się wyraźnie w pierwszej linii. Nie wdawać się w debatę na temat bezpieczeństwa poprzez zaciemnienie, ale "To jest oprogramowanie, innymi słowy, nie jest bezpieczne". Lub "To jest system haseł, a przez to niezabezpieczony". W rzeczywistości, gdy o tym myślę, moje rozwiązanie jest tak bezpieczne, jak silne hasło, zakładając, że żadna niezwiązana z nim dziura nie pozwala na katalogowanie listy atakujących. – timdev

0

Uczyń folder WWW niedostępnym przez chmod. PHP nadal będzie w stanie uwzględnić/wymagać tego, co jest na serwerze, ale użytkownicy nie będą w stanie nawigować do plików kiedykolwiek.

Przykład: Ustawiono na 770, IE Użytkownik i grupa mogą czytać/pisać/wykonywać, inni nie mogą nic zrobić.

+0

Ta odpowiedź jest błędna. Z wyjątkiem konfiguracji SuExec/CGI, PHP używa uprawnień serwera WWW. Jeśli plik nie jest dostępny na serwerze sieciowym, jest również niedostępny dla PHP. – Borealid

+0

Mam folder ustawiony na 770 i mogę dołączyć, ale nie mogę bezpośrednio nawigować w przeglądarce. – Robert

+0

Sądzę również, że źle zrozumiałeś, serwer internetowy nadal ma uprawnienia, użytkownik i grupa mają uprawnienia w 770, a inne nie. Daje to PHP pełny dostęp do plików, przeglądarka nie dostanie nic. – Robert

1

Ponieważ PHP korzysta z uprawnień przez użytkownika serwera WWW, nie ma sposobu, aby ograniczyć dostęp do plików bez albo:

  • umieszczenie ich poza docroot
  • Zmiana konfiguracji serwera WWW, aby uniemożliwić dostęp do tych pliki
  • Zmiana plik tak będzie interpretowany przez serwer WWW, tym samym ukrywając jego zawartość

umieszczenie ich w bazie danych jako outsi liczy de the DOCROOT. W przypadku trzeciej opcji można utworzyć pliki PHP w formacie PDF, ale szczerze mówiąc, byłoby to całkiem zawiłe.

Polecam skontaktować się z GoDaddy i sprawdzić, czy mają jakiś sposób, aby skonfigurować uprawnienia do pliku katalogu.

+0

Sprytny. Zakładając, że OP nie może nic zrobić na serwerze, podoba mi się twoja trzecia opcja, w połączeniu z podstawowym kodem, który opisałem. – timdev

Powiązane problemy