Zastita fajlova u direktorijumu od direktnog downloada

2

Zastita fajlova u direktorijumu od direktnog downloada

offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3747
  • 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: 3747
  • 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: 1630
  • 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 645 korisnika na forumu :: 6 registrovanih, 3 sakrivenih i 636 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: Darkhunter, darkojbn, Dorcolac, Excalibur13, Lazarus, Oscar2