Avatar billede masteraaen Novice
03. september 2013 - 22:45 Der er 7 kommentarer

PHP - låse pdf-dokumenter bag login

Hej.

Jeg har på mit site en mulighed for, at brugere kan uploade pdf-filer til sitet. Nogen af dem skal de være logget på for at få adgang til. Dvs. der er kun linket til filen, hvis de er logget på.

Men nu har jeg fundet ud af, at hvis man taster adressen til filen direkte i adressefeltet, så åbner den bare. Filen er jo egentlig ikke gemt bag en kode, da jeg kun har tænkt på at man skal være logget ind, før at man får linket til filen...

Hvordan får jeg selve filen beskyttet med login?
Avatar billede masteraaen Novice
03. september 2013 - 22:46 #1
Måske jeg skal oplyse, at brugeren normalt logger på med php og en session....
Avatar billede jakobdo Ekspert
03. september 2013 - 22:56 #2
Det du skal starte med at gøre, at at smide alle filerne uden for htdocs / www.

Hvis du f.eks. har følgende mappe / filstruktur på din webserver / webhotel:

/htdocs <-- Her har du din hjemmeside, f.eks. index.php osv...
/logs <-- Måske logs over besøg og fejl
/private <-- Opret denne mappe, den kan ikke tilgåes fra hjemmeside, men kan tilgåes via php.
Så laver du en kode, som f.eks. hedder: get_private_file.php
Den læser så filen fra private folderen, hvis altså brugeren er logget ind og så har du din sikkerhed.
Gider dog php en smule ekstra arbejde, men dermed kan dit system ikke snydes.
Avatar billede moddi100 Seniormester
04. september 2013 - 11:18 #3
Som #2 siger. Du gemmer filen uden for brugerens rækkevidde og bruger så php til at læse og downloade filen. Dette kunne du f.eks. gøre ud fra en tabel i databasen, der lister et ID til filen, samt et felt, der angiver om man skal være logget ind for at downloade:

<?php

$id = $_GET['file'];

// Tjek om $id findes i databasen, og hent $file ud fra
// den, såfremt der er en postering:

$file = 'document.pdf'; // Eksempel

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/pdf');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}
?>
Avatar billede masteraaen Novice
03. oktober 2013 - 11:48 #4
Super. Det vil tage mig noget tid at inkorporere denne løsning, men den er brugbar.

Jeg har behov for, at den enkelte bruger kan oprette en mappe (sker automatisk når en formular udfyldes), hvor denne brugers filer ligger i. Er det muligt at gøre i 'private'-delen af serveren i kombination med ovennævnte?
Avatar billede masteraaen Novice
03. oktober 2013 - 11:48 #5
I må gerne lave et svar uanset.
Avatar billede jakobdo Ekspert
03. oktober 2013 - 21:27 #6
Svar!
Avatar billede moddi100 Seniormester
03. oktober 2013 - 21:32 #7
Det er jo blot at oprette en mappe igennem PHP, når formularen er udfyldt:



if($_POST)
{
  // Valider dine inputs

  // Opret hvad du nu skal med din formular




  // Hent brugernavnet eller hvad mappen nu skal hedde. Tal er en
  // fremragende ide, da du så ikke skal bekymre dig om
  // specialtegn. Med brugernavn vil den se ud sådan her:

  $brugernavn = "Jens"


  // Fjern alle andre tegn end A-Z, 0-9 og _ eller -

  $sikkert_brugernavn = preg_replace("/[^a-zA-Z0-9_-]/", "", $brugernavn);

 
  // Find mappens fulde navn
  $rod_mappe = dirname(__FILE__);
  $bruger_mappe = $rod_mappe . '/' . $sikkert_brugernavn;


  // Opret mappe, hvis den ikke allerede findes
  if(!is_dir($bruger_mappe))
  {
      if(mkdir($brugermappe, 0755))
        echo "En mappe blev oprettet til brugeren!";
      else
        echo "Mappen kunne ikke oprettes!";
  }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester