Stahování souborů až po přihlášení

Petti

Stahování souborů až po přihlášení
« kdy: 25. 10. 2012, 11:08:20 »
Napsal jsem si jednoduché stránky, které slouží pro zobrazování nějakých informací z MYSQL.
Do těchto stránek bych potřeboval zakomponovat "stahování s autorizací".
V adresáři www má složku down, do které chci umístit soubory, které bude možné pomocí jednoduchého souborového
manažera prostřednictvím php stáhnout. Manažer jako takový se mi nezobrazí dřív, dokud nejsou platné požadované "sešny".
Pokud ale udělám http://www.web.cz/down/soubor1.exe dostanu se bez autorizace ke stažení souboru  :( .
Četl jsem něco málo na internetu a všude je doporučeno pro podobné "akce" použít .htpasswd. Já bych raději použil autorizaci pomocí mysql a SESSIONS.
Mohl by někdo poradit ?
« Poslední změna: 25. 10. 2012, 11:26:29 od Petr Krčmář »


Pavouk106

  • *****
  • 2 400
    • Zobrazit profil
    • Můj blog
    • E-mail
Re:PHP - zabránění neoprávněnému stahování souborů
« Odpověď #1 kdy: 25. 10. 2012, 11:18:38 »
Někam si dáš originální soubory, ale uživateli je budeš nabízet ke stažení z vygenerovanýho místa, kde na ně budou odkazy. Vždy jen jednorázově = skončí stahování, odkaz se smaže (tohle nevím, jak udělat).

Takže v /down budeš mít například originály a ve složce /downloads bueš dělat odkazy.

Uživatel pak přijde, bude ověřen, dostane unikátní URL ke stažení, která se po skončení stahování smaže.

Jiná možnost by pak byla "natáhnout" si ten soubor do PHP a vyexpedovat ho přímo. Pak by přistoupil na stránku soubor1.php a ono mu to předhodilo EXE. Jestli to ta jde, to netuším.

Petti

Re:Stahování souborů až po přihlášení
« Odpověď #2 kdy: 25. 10. 2012, 11:32:36 »
Ale to asi neřeší situaci. Pokud si vytvořím soubor 1.pdf a  nahraji ho do down a uživatel mi zadá pomocí URL úplnou cestu k tomuto souboru www.web.cz/down/1.pdf  tak se mu i tak povede stažení.

To by ten file musel ležet mimo www adresář a třeba cgi na serveru, by dělalo ty dočasný přesuny do downloads.
Ale to mi přijde zbytečně moc komplikované.

alfi

  • ****
  • 338
    • Zobrazit profil
    • E-mail
Re:PHP - zabránění neoprávněnému stahování souborů
« Odpověď #3 kdy: 25. 10. 2012, 11:36:33 »
.htaccess umožňuje použití HTTP basic, příp. třeba digest autorizace, kterou umí všechny dnešní browsery.
jako backend (seznam username-heslo) může sloužit soubor .htaccess, ale třeba i databáze, PAM, ldap.. viz různé "mod_auth_*" moduly do apache.

pokud trváš na session, pak
- musíš najít modul, který se bude uživateli tvářit jako session a apachi simulovat http autorizaci (kdysi to uměl třeba modul mod_auth_pgsql. ale nevím, jestli to pořád platí..)
- nebo si napsat aplikaci, přes kterou ten soubor budeš stahovat (nejlépe mimo /var/www) a která někde v db ověří hesla (ale pokud jsou soubory větší nebo tam bude větší provoz, můžeš narazit na problémy s výkonem - přeci jen download 100MB souboru přímo přes apache bude méně náročné na výkon,  než stejný soubor protáhnout přes php nebo javu)

jen pak doporučuju (s basic autorizací určitě) používání https/SSL, jinak jde heslo odposlechnout (to platí i pro přihlašování přes sessions). a opatrně s konfigurací apache, protože např. nastavení hesla pro <Directory /var/www> a potom zrušení/špatné přenastavení hesla pro <Location /down> může mít nečekané důsledky = přístup bez hesla :-)


Petti

Re:Stahování souborů až po přihlášení
« Odpověď #4 kdy: 25. 10. 2012, 11:45:14 »
Já si tam už nějaké ověření pomocí mysql a session vytvořil, tak jsem to chtěl využít.
Tzn. chceš stahovat  -> session je zaregistrovaná -> ok... a naopak ...

Takže teda ověření před stažením pomocí backend spojený s mysql ?


Sten

Re:PHP - zabránění neoprávněnému stahování souborů
« Odpověď #5 kdy: 25. 10. 2012, 12:23:22 »
Pro správu souborů bych doporučil WebDAV: mod_auth_... + mod_davfs. Stahování funguje stejně, ale DAV umí navíc soubory nahrávat.

přeci jen download 100MB souboru přímo přes apache bude méně náročné na výkon,  než stejný soubor protáhnout přes php nebo javu

Výkon řeší sendfile.

Paličák

Re: Jednorázový odkaz
« Odpověď #6 kdy: 25. 10. 2012, 12:40:55 »
To co ti tu radil třeba Pavouk106, a zřejmě i to čeho chceš dosáhnout, je právě to proč nemáme (je nás kupodivu mnoho) rádi moderní přístup ke tvorbě webů i kdyby nakrásně design opravdu za něco stál (Což je velmi často, u podobně smýšlejích jedinců, spíše ojedinělé. Promiň, že paušalizuji, ale to mi říká moje zkušenost získaná procházení webem.) je naprosto běžné, že při stahování se čas od času něco pokazí, u multimédií si chceš třeba udělat představu o co jde, než stáhneš celek,...

Podobným přístupem prostě lidem komplikuješ život. Já třeba takové weby navštěvuji minimálně a ani ostatním, a to prosím nikdy, neposkytuji žádné odkazy na nestabilní (v čase proměnlivý) odkaz. Pokud jde o přihlášení, nebo jinou verifikaci, zde to čas od času strpím (není-li vyhnutí a než najdu náhradu), ale i tak trvám na stabilních odkazech.

Petti

Re:Stahování souborů až po přihlášení
« Odpověď #7 kdy: 25. 10. 2012, 13:00:42 »
Nejde mi nějak o nějakou úchvatnou grafiku. Já potřebuju hlavně, aby to fungovalo  :)
Sice by asi málo kdo zkoušel www.web1.cz/down/nahodny soubor ...
Ale i tak by bylo vhodné ošetřit nějak přístup k souborům.
Je to čistě php script, kterej jenom zobrazuje obsah složky a vytvoří link pro stažení zobrazených souborů.
Žádné editace aj...

Zabezpečit samotný file manager není problém, ale ty soubory zabezpečit, aby nešly stáhnout pomocí té přímé cesty v URL....
To je pro mě oříšek ...

Jinak všechno se snažím řešit tak, aby uživatele museli co nejméně přemýšlet  :)



Pavouk106

  • *****
  • 2 400
    • Zobrazit profil
    • Můj blog
    • E-mail
Re:Stahování souborů až po přihlášení
« Odpověď #8 kdy: 25. 10. 2012, 14:05:51 »
Paličák: Víceméně to mám stejně, jen mě to napadlo jako relativně jednoduché a funkční řešení, proto jsem to nadhodil.

Kdyby šlo o obrázky/fotky, tak je natáhnu do PHP a "pošlu" ze serveru jako .php soubor (s hlavičkou obrázku atd. jak se to prostě dá udělat). Takový PHP obrázek by mohl mít i pevnou adresu, která bude vždy platná a přitom se pořád ještě před odesláním dá ověřit SESSIO atd. Je to jako blokování hotlinků (obrázky na různých imageserverech - když není referer přímo ten server, tak místo obrázku uvidíš nápis, že jsi blbec a že hotlink neschvalujou).

Jestli to jde i s jiným typem souboru, to nevím, ale byla by to možnost...

Petti

Re:Stahování souborů až po přihlášení
« Odpověď #9 kdy: 25. 10. 2012, 14:32:08 »
Ještě mě napadlo, jestli php neumí načítat i obsah složek mimo kořen www ?
Za předpokladu, že zdrojová složka má nastavené patřičné oprávnění.

Re:Stahování souborů až po přihlášení
« Odpověď #10 kdy: 26. 10. 2012, 15:48:34 »
Ale to asi neřeší situaci. Pokud si vytvořím soubor 1.pdf a  nahraji ho do down a uživatel mi zadá pomocí URL úplnou cestu k tomuto souboru www.web.cz/down/1.pdf  tak se mu i tak povede stažení.

To by ten file musel ležet mimo www adresář a třeba cgi na serveru, by dělalo ty dočasný přesuny do downloads.
Ale to mi přijde zbytečně moc komplikované.

Ak chces zamezit pristupu do adresara, tak tam vytvor '.htaccess' a strc do neho 'deny from all' :) co si tak precitat manual k apache? najdes tam aj kopu inych zaujimavejsich fint :D

K

Re:Stahování souborů až po přihlášení
« Odpověď #11 kdy: 26. 10. 2012, 16:34:42 »
Jednoduse jak uz tu nekdo psal:
- das soubory do jednoho adresare
- zablokujes "bezny" pristup pres web pomoci deny from all v htaccess
- udelas php skript ktery podle parametru treba v get pozna jaky ma nabidnout soubor a po radnem prihlaseni ho ukaze

nic sloziteho na tom neni

adresy pak mohou byt stabilni:
/down.php?file=pepa
/down.php?file=franta

script pri spusteni udela:
  • overi prihlaseni
  • pokud neni prihlasen:
    • vrati stranku s kodem 404 / 401 / 403 / 500 proste podle potreby
    • konec
  • pokud je prihlasen:
    • posle hlavicky
    • vypise obsah souboru
    • konec

jen si dej pozor abys neudelal diru typu:

/down.php?file=/mujweb/mojeskripty/down.php 

apod. ktera by ti pak vypsala i soubory ktere nema!

alfi

  • ****
  • 338
    • Zobrazit profil
    • E-mail
Re:Stahování souborů až po přihlášení
« Odpověď #12 kdy: 29. 10. 2012, 09:43:01 »
jen si dej pozor abys neudelal diru typu:

/down.php?file=/mujweb/mojeskripty/down.php 

apod. ktera by ti pak vypsala i soubory ktere nema!
nejlíp zároveň s nastavením open_basedir. bez toho bych se bál jakékoliv php provozovat :) (nikdy nevíš, kdy tam někdo udělá díru.. ano, php obecně umí číst z libovolného adresáře i mimo www, tj. včetně /etc)

Re:Stahování souborů až po přihlášení
« Odpověď #13 kdy: 29. 10. 2012, 12:28:00 »
nejlíp zároveň s nastavením open_basedir. bez toho bych se bál jakékoliv php provozovat :) (nikdy nevíš, kdy tam někdo udělá díru.. ano, php obecně umí číst z libovolného adresáře i mimo www, tj. včetně /etc)

Myslím, že postačí před jméno souboru vložit "./" (aby tam nikdo nestrčil "/" nebo nedejbože "http://") a nejpřijmout žádný text obsahující dvě tečky, nebo ještě lépe zakázat i lomítka. Tím se tam nedostanou žádné cesty.

Kit

Re:Stahování souborů až po přihlášení
« Odpověď #14 kdy: 29. 10. 2012, 12:43:29 »
Myslím, že postačí před jméno souboru vložit "./" (aby tam nikdo nestrčil "/" nebo nedejbože "http://") a nejpřijmout žádný text obsahující dvě tečky, nebo ještě lépe zakázat i lomítka. Tím se tam nedostanou žádné cesty.

Používám funkci
Kód: [Vybrat]
basename();která by snad měla ošetřit vše potřebné.