Zastita fajlova u direktorijumu od direktnog downloada

2

Zastita fajlova u direktorijumu od direktnog downloada

offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3662
  • Gde živiš: 127.0.0.1

Mnogo prosto. U .htaccess stavis sledece:

RewriteEngine On RewriteCond %{QUERY_STRING} !(^|&)secured=true($|&) RewriteRule download/(.+) download.php [nc,L]
S tim sto "secured=true" mozes da zamenis cime god hoces. U download.php stavis sledece:

<?php session_start(); function get_mime_type($file) {    $mime_types = array(          "pdf"=>"application/pdf",          "exe"=>"application/octet-stream",          "zip"=>"application/zip",          "rar"=>"application/rar",          "docx"=>"application/msword",          "doc"=>"application/msword",          "xls"=>"application/vnd.ms-excel",          "ppt"=>"application/vnd.ms-powerpoint",          "gif"=>"image/gif",          "png"=>"image/png",          "jpeg"=>"image/jpg",          "jpg"=>"image/jpg",          "mp3"=>"audio/mpeg",          "wav"=>"audio/x-wav",          "mpeg"=>"video/mpeg",          "mpg"=>"video/mpeg",          "mpe"=>"video/mpeg",          "mov"=>"video/quicktime",          "avi"=>"video/x-msvideo",          "3gp"=>"video/3gpp",          "css"=>"text/css",          "jsc"=>"application/javascript",          "js"=>"application/javascript",          "php"=>"text/html",          "htm"=>"text/html",          "html"=>"text/html"    );    $parts = explode('.',$file);    $extension = strtolower(end($parts));    return $mime_types[$extension]; } // Ovde proveris da li sme da pridje fajlu, nesto tipa if (!$_SESSION['logged_in']) {    die('Nece moci ove noci!'); } // Odavde nanize ide prikaz/download fajla (u zavisnosti od tipa) $file = $_SERVER['REQUEST_URI']; $path = 'http://' . $_SERVER['HTTP_HOST']; $content = file_get_contents($path.$file.'?secured=true'); // ako si menjao "secured=true" u htaccess-u, zameni ga i ovde $mime_type = get_mime_type($path.$file); header('Content-type: ' . $mime_type); echo $content; die();
I vozi Misko Ziveli

Btw, funkcija get_mime_type je dodata jer je mime_content_type() deprecated, a FILE_INFO ekstenzija mozda nije dostupna na hostu koji koristis.



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Software developer
  • Pridružio: 06 Sep 2005
  • Poruke: 3800
  • Gde živiš: Beograd

Hvala svima na predlozima, trenutno testiram jednu opciju i izgleda da radi, sad ga testiram jos
Stavio sam u upload folder .htaccess u kojem mi stoji deny all
Napravio sam php fajl download.php koji prima fileId koji setujem u linku. Na download.php imam sledece(na grubo, bez filtriranja)
<?php include("const/connection.php"); ?> <?php session_start(); if(!isset($_SESSION['username'])) {    echo "Korisnik nije ulogovan";    die(); } $fileId = $_GET['fileId']; $result = mysql_query("SELECT naziv, ekstenzija FROM dodatnifajlovi WHERE idDodatniFajlovi='$fileId'"); if($result && mysql_num_rows($result) > 0) {    $row=mysql_fetch_array($result);    if($row)    {       $content_len=@filesize("upload/".$row['naziv']);       Header("Content-type: ".$row['ekstenzija']);       Header("Content-type: octet-stream");       $fileName = $row['naziv'];       Header('Content-Disposition: attachment; filename='.$fileName);       if($content_len!=FALSE)       {          Header("Content-length: $content_len");       }       readfile("upload/".$row['naziv']);           } } else {    echo "Nije pronadjen traženi fajl";    die(); }


@Rastafarii
Ako ovo moje ne prodje probacu sa ovim. Logicno deluje, samo da se implementira.



offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3662
  • Gde živiš: 127.0.0.1

Prvo - moguci problem - Content-type nije samo ekstenzija (vidi moj post iznad), ali ne mogu da tvrdim da ce biti problema jer ne znam sta upisujes u tu kolonu u bazi. Plus dva puta setujes isti header - sto dovodi do toga da se samo drugi postuje - taj sa ekstenzijom je potpuno nepotreban.

Drugo - ako neko nabode direktan link do fajla, kod tebe ce dobiti HTTP 403 Forbidden, a kod mene mozes da mu prikazes poruku da se prvo uloguje Wink

Ovo moje sam testirao pre nego sto sam objavio post - nema sanse da pridjes fajlu ako nisi ulogovan (odnosno ima, ali moras da nabodes tacan query string koji dodaje PHP, a to je slozices se prilicno neverovatno). A imajuci u vidu da hoces forced download, a ne prikaz ukoliko je moguc (npr za slike, pdf i tome slicno) onda mozes potpuno da izbacis proveru content type-a i napravis od tvoje i moje skripte jednu (provera downloada moja, sam prikaz fajla tvoj) i budes zasticen kao beli medved.

offline
  • C# and PHP Developer
  • Pridružio: 16 Feb 2011
  • Poruke: 1627
  • Gde živiš: Pancevo

@N1k0l4 brate Very Happy Pa to je gradivo prvog razreda, ja tek sad videh post. Ovo sto ti je rasta napisao mozes opusteno da initializujes u Front Kontroleru tako da ti na celom sajtu bude obezbedjeno.

Ko je trenutno na forumu
 

Ukupno su 721 korisnika na forumu :: 40 registrovanih, 2 sakrivenih i 679 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., amaterSRB, Apok, babaroga, bankulen, bojanM84, cezar 35, Drug pukovnik, Dukelander, HrcAk47, ivan979, Konda, KUZMAR, L3g1oN, lekso, Marko Marković, MB120mm, menges, Milan A. Nikolic, misaru, moldway, pein, pera12345, Regrut Boskica, repac, RJ, Sirius, Snorks, sokojet, Sr.Stat., tanakadzo, Trpe Grozni, trutcina, vasa.93, VES 11119, VJ, voja64, W123, wolf1, zexoni