Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Bezpieczny upload
Forum PHP.pl > Forum > PHP
Michu
Witam. Chcę skonstruować system umożliwiający użytkownikom upload swoich plików na serwer i porządkowanie ich w katalogach.

Cała struktura wyglądałaby następująco:

  1. # index.php
  2. # jakisplik.php
  3. # ijeszczeinny.php
  4. # users
  5.          * user123
  6.                    o img1.jpg
  7.                    o vid1.flv
  8.                    o file1.php
  9.                    o mojepliki
  10.                              @ doc1.txt
  11.                              @ doc2.txt
  12.          * user456
  13.                    o img2.jpg
  14.                    o vid2.flv

Każdy użytkownik ma do dyspozycji swój folder w folderze users.

Problemy jakie mi się nasuwają są następujące:
- W jaki sposób umożliwić wgląd do folderów dopiero po zalogowaniu np. poprzez index.php?
- W jaki sposób umożliwić użytkownikom odpalanie skryptów php nie mając obawy o to że dobiorą się do plików innych osób, nie mówiąc już o strukturze strony?
- Co jeszcze musiałbym zrobić aby taki system można byłoby uznać za bezpieczny?
pinochet
1. Wystarczy uniemożliwić wyświetlanie katalogu "folder listing" może jednak lepiej było by pozwolić użytkownikom na zdecydowanie czy pozwalają na listing swoich folderów ... można to zrobić w htaccess lub globalnie w ustawieniach serwera www
2. Za to zazwyczaj odpowiada juz system operacyjny. Wiem że kiedyś były problemy z wieloma kontami na jednym serwerze - przykładowo apache działał na koncie które miało dostęp do plików innych userów co umożliwiało includowanie nie swoich plików biggrin.gif
Po to powstało safe-mode w php ale jak jest teraz ( Apache 2) nie wiem do końca.
Michu
Po dłuższym namyśle zdecydowałem że odpalanie plików php w tych folderach nie będzie potrzebne. Usuwa się więc problem bezpiecznego wywoływania skryptów. Poradzę sobie z blokowaniem ich działania.

Pozostaje jednak problem ochrony treści folderów. Chodzi mi bardziej o rozwiązanie uniemożliwiające dostęp do plików poprzez url.

Przykład:
  1. *index.php
  2. * users
  3.          o user123
  4.                    @ doc1.txt
  5.                    @ doc2.txt
  6.          o user456
  7.                    @ doc3.txt
  8.                    @ doc4.txt

Po zalogowaniu w index.php jako np. user123 miałbym dostęp do plików z mojego folderu, ale pliki znajdujące się w folderze user456 nie byłyby już dostępne, nawet poprzez url. Jak takie coś zbudować?
Zmorcia
Wklej do folderu pusty plik index.html i git smile.gif
Michu
Nie chodzi o blokadę listingu plików, tylko o blokadę dostępu do nich. Jeśli znam url pliku, np. users/user456/doc1.txt to dostanę ten plik.

Pytanie brzmi: jak uniemożliwić dostęp do pliku poprzez url jeśli nie jest się zalogowanym? (bez htaccess proszę)
Marq
Może jakaś metoda show.php?file=foo/foo/bla.txt, oczywiście z całym filtrowaniem $_GET etc etc. W niej sprawdzasz czy użytwkonik jest zalogowany, i wyświetlasz bądź blokujesz?
Michu
Hmm... nawet dobre rozwiązanie, ale:

1. może być problem gdy plik będzie duży.
2. nie jestem pewien, ale chyba będzie to za sobą pociągało zmianę rozszerzenia, np: ściągam plik swf, a otrzymuję ściągnięty plik show.php. Oczywiście gdybym zmienił rozszerzenie show.php na show.swf wszystko byłoby ok, ale...

Bardziej jednak obawiałbym się wydajności takiego rozwiązania. Ale ok, jedno jest. Jeszcze jakieś?


EDIT:
Można by utworzyć łatwo dostępny folder typu mojadomena.pl/uploads, do którego plik byłby kopiowany gdy ktoś chce go ściagnąć. Po zakończeniu kopiowania zrobiłoby się redirect do tego pliku, omijamy problemy rozszerzenia. Znowu jednak kłania się wydajność.

Czy istnieje jakiś bezpośredni sposób wpływania na dostęp do plików, coś jak .htaccess tylko że zależne od sesji?
Marq
Na wyświetlanej stronie możesz wstawić bezpośredni link do ściągnięcia winksmiley.jpg
Michu
Marq, to odpada. Używanie bezpośrednich url'i oznaczałoby że każdy kto go zna może się dostać do pliku, a tego chcę uniknąć. Zobacz edit z mojego poprzedniego postu.
Michu
Na stronie którą mi podałeś znalazłem odnośnik do tej:
http://elouai.com/force-download.php

Skrypt omija czytanie pliku przy uzyciu readfile(), ciekawe i praktyczne.
To chyba to, dzięki smile.gif
marcio
Hmm pisalem ostatnio przegladarke plikow w php i wiem jak to jest na twoim miejscu zrobilbym tak przy rejestracji tworzysz katalog user np rejestruje sie user marcio a katalog nazywasz dir_marcio123 i zapisujesz jego nazwe do bazy mysql, przy logowaniu katalog danego user'a ladujesz do cookie/sesji i sprawdzasz czy przegladany katalog jest rowny tej z sesji jesli nie to jakis blad czy cos oczywiscie musisz to tylko odpowiednie zabezpieczyc
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.