Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Petti 25. 10. 2012, 11:08:20

Název: Stahování souborů až po přihlášení
Přispěvatel: Petti 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 ?
Název: Re:PHP - zabránění neoprávněnému stahování souborů
Přispěvatel: Pavouk106 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.
Název: Re:Stahování souborů až po přihlášení
Přispěvatel: Petti 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é.
Název: Re:PHP - zabránění neoprávněnému stahování souborů
Přispěvatel: alfi 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 :-)

Název: Re:Stahování souborů až po přihlášení
Přispěvatel: Petti 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 ?
Název: Re:PHP - zabránění neoprávněnému stahování souborů
Přispěvatel: Sten 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 (http://php.net/manual/en/function.http-send-file.php).
Název: Re: Jednorázový odkaz
Přispěvatel: Paličák 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.
Název: Re:Stahování souborů až po přihlášení
Přispěvatel: Petti 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  :)


Název: Re:Stahování souborů až po přihlášení
Přispěvatel: Pavouk106 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...
Název: Re:Stahování souborů až po přihlášení
Přispěvatel: Petti 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í.
Název: Re:Stahování souborů až po přihlášení
Přispěvatel: Death Walker 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
Název: Re:Stahování souborů až po přihlášení
Přispěvatel: K 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:

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!
Název: Re:Stahování souborů až po přihlášení
Přispěvatel: alfi 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)
Název: Re:Stahování souborů až po přihlášení
Přispěvatel: Ondřej Novák 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.
Název: Re:Stahování souborů až po přihlášení
Přispěvatel: Kit 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é.
Název: Re:Stahování souborů až po přihlášení
Přispěvatel: Petti 02. 11. 2012, 12:32:41
Děkuji za rady !
Už jsem to vyřešil.

Složka pro download je přejmenovaná na 20 náhodných znaků. V této složce je pak strčený "průzkumník.php", který má "./" jako kořenový adresář. Takže by nemělo být možné opustit tento root kořen.

Po přihlášení pomocí php a mysql se nahraje průzkumník a soubory se vesele zobrazují :o)
Běžné procházení adresáře je zakázáno, takže i kdyby se do složky někdo dostal bez přihlášení, stejně se nic nezobrazí.

Pokud, ale uživatel zkopíruje link na soubor a pošle ho tzn. "www.stranka.cz/sde593w5s7g7r8e8e49q/adr/archiv.rar"
tak i bez přihlášení lze soubor stáhnout. Ale to už mi tak nevadí, jde mi jenom o to, aby se cizí návštěvníci nedostali lehce k
souborům na serveru.

Tohle sice není "very secure", ale svým účelům to postačí.
Název: Re:Stahování souborů až po přihlášení
Přispěvatel: Kit 02. 11. 2012, 13:11:16
Když ten skript uděláš stylem proxy, tak se nikdo skutečnou cestu k souboru nedozví.
Název: Re:Stahování souborů až po přihlášení
Přispěvatel: alfi 16. 11. 2012, 13:18:17
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.
já bych do toho nešel :-)
proč by se soubor nemohl jmenovat aa..txt? (divný název, ale může se stát)
a ona tečka je taky %2e, %2E, místo .. taky stačí na začátek přidat /etc/
možností je spousta. a na to, že - ani v budoucnu a/nebo v některém dalším kroku zpracování - nepůjde nějaký klikyhák přepsat na .. bych fakt nespoléhal. php prostě mimo svůj "root" nemá co pohledávat :)
Název: Re:Stahování souborů až po přihlášení
Přispěvatel: Death Walker 16. 11. 2012, 14:45:20
Kód: [Vybrat]
<?php

//skontrolujeme ci je uzivatel prihlaseny
if(!$session->is_authenticated){
  
// ak nie posle ho niekam
  
header('HTTP/1.0 401 Unauthorized');
  
// a ukonci sa
  
die();
}else{
  
// ak je tak zistime mime typ suboru
  
$mime=finfo::file($filepath,FILEINFO_MIME);
  
// a posleme ho na vystup
  
header("Content-type: $mime");
  
header("Content-Disposition: filename=\"$filename\"");
  
header("Content-length: $filesize");
  
header("Cache-control: private");
  
readfile($filepath);
}

a do adresara kde mas ulozene subory prihodis .htaccess so obsahom:
Kód: [Vybrat]
deny from all

v tom kode nie su osetrene vynimky ani sposob ziskavia udajov o stahovanom subore - to si zriesis sam. Taktiez ak to budes testovat na widlach tak tam asi nebudes mat extension fileinfo - na linuxe je zvedsa standartne v distre.

A ak pouzijes cudzi kod tak nezabudni uviest aj autora  ;D