Avatar billede nemlig Professor
05. januar 2011 - 22:25 Der er 15 kommentarer og
1 løsning

Beskyttelse af dokumenter i bestemt servermappe

Hejsa.
Jeg har et login-system og har brug for et simpelt dokument-arkiv system, som der kun kan opnåes adgang til efter login.

Det drejer sig alene om PDF-dokumenter (mødereferater), som uploades via et script eller ftp til en bestemt mappe.

Jeg har i forvejen beskyttet en mappe med .htaccess med denne kode

order deny,allow
deny from all

Men så mener jeg kun, der kan opnåes adgang via FTP, og tanken er altså, at der skal være browseradgang efter login.

Løsningen kunne også være at smide dokumenterne i MySQL, men så skal det ske via et upload-script, og så har webhotellet en begrænsning på filstørrelsen på 10 Mbyte. Det er heller ikke ideelt.

Jeg vil gerne en løsning, hvor jeg kan udnytte det login-system, som jeg har i forvejen (SESSION og MySQL).

Nogen der har en nem og god løsning.
Avatar billede repox Seniormester
05. januar 2011 - 22:35 #1
Du kan lave et PHP script der henter de pågældende data og tvinger dem til download hvis credentials er i orden:

<?php

$req_file = $_GET["req_file"];
$req_file = "/mappe/med/filerne/".$req_file;

if( kontrol om brugeren må downloade netop den fil )
{

  if( file_exists($req_file) )
  {
    header('Content-type: application/pdf');
    header('Content-Disposition: attachment; filename="downloaded.pdf"');
    echo file_get_contents($req_file);
  }
  else
    header("Location: file_not_found.php");
}
else
  header("Location: permission_denied.php");

?>
Avatar billede nemlig Professor
05. januar 2011 - 23:02 #2
Spændende, men for at være helt sikker, vil du så kommentere følgende:

1. Den valgte arkivmappe får en .htaccess-fil med dette indhold.
  order deny,allow
  deny from all

2. Jeg laver et script, hvor jeg lister filerne fra den beskyttede mappe, og linker til hver fil, hvor jeg kalder dit forslag til script med GET-parameter.
Avatar billede Mik2000 Professor
06. januar 2011 - 00:07 #3
Hej

Men mappen er vel stadig ikke sikker, for hvis man skriver

domæne.dk/mappe/med/filerne/navn.pdf
så vil man kunne åbne det uden at logge ind

Og scriptet vil vel ikke kunne hente når httaccess filen er der vel?
Avatar billede repox Seniormester
06. januar 2011 - 10:20 #4
#2
1. Unødigt - chmod mappen i stedet eller flyt den uden for webscope. Men resultatet er det samme.

2. Det lyder som en fornuftig løsning.

#3
Hvad er en 'sikker mappe'? Hvis mappen er beskyttet af en .htaccess der ikke tillader HTTP adgang til mappen, så er filerne jo sikret mod visning/hentning.

Scriptet vil fint virke - medmindre du tilgår filen via cURL (som vil være molbo-agtigt, når filen alligevel ligger lokalt) har htaccess ikke noget at skulle have sagt, hvis et PHP script vil have adgang til en fil.
Avatar billede nemlig Professor
07. januar 2011 - 14:04 #5
#4.

1. Hvis jeg på anvender cmod 711 på mappen, og derefter uploader nogle pdf-filer, så kan jeg fortsat hente filerne via et direkte HTML-link. Hvis jeg derimod anvender cmod på filerne, så kan jeg ikke hente dem. Men det vil være bøvlet, hvis jeg skal ændre attributterne på filerne.

#3
.htaccess løser problemet. Så er det heller ikke muligt med HTTP-adgang.
Avatar billede nemlig Professor
07. januar 2011 - 14:43 #6
Denne her er mappebeskyttet med chmod 77:
http://www.fam-johansen.dk/docs/test.pdf

Denn her er htaccess beskyttet:
http://www.fam-johansen.dk/docs1/test.pdf
Avatar billede Mik2000 Professor
07. januar 2011 - 22:26 #7
Hej

Du kan jo CHMOD med kode, så hvis filerne ligges op via et system, kan de CHMOD

REPOX:
- det lyder som om du har rigtig godt styr på det. Så selvom vi er lidt tunge, kan du så ikke prøve at forklare det igen.

Er dette rigtig forstået:
1: Hvis vi har mappen, så kan vi lave en CHMOD på den og på filerne
2: Disse skal CHMOD'es - skal det være 700 eller hvad?
3: Hvis man så benytter scriptet:
<?php

$req_file = $_GET["req_file"];
$req_file = "/mappe/med/filerne/".$req_file;

if( kontrol om brugeren må downloade netop den fil )
{

  if( file_exists($req_file) )
  {
    header('Content-type: application/pdf');
    header('Content-Disposition: attachment; filename="downloaded.pdf"');
    echo file_get_contents($req_file);
  }
  else
    header("Location: file_not_found.php");
}
else
  header("Location: permission_denied.php");

?>
... så kan man læse filerne alligevel, selvom det ikke er muligt med et normalt link?

4:Er det korrekt?
5: Og vil man så kunne slette dem via ftp også
Avatar billede repox Seniormester
09. januar 2011 - 11:25 #8
#5
Hov - jeg glemte helt tråden igen... :/
Umiddelbart vil en .htaccess løsning være den nemmeste, hvis du ikke kan flytte den uden for http scopet, så det ville være den løsning jeg ville vælge. For chmod bliver, som du selv siger, hurtig en bøvlet affære.

#7
Som tidligere nævnt kan du godt opnå den ønskede effekt med chmod, men det giver meget lidt mening, hvis .htaccess er en mulighed - det bevirker ikke filtilladelser og så er det effektivt.

Men det script som du gengiver (som jeg skrev) tvinger brugeren til at downloade det indhold, og ikke til visning i browseren.
Avatar billede nemlig Professor
11. januar 2011 - 08:10 #9
#7
Jeg har prøvet koden, og den virker perfekt efter få tilretninger.

Sender Repox et svar. Tusind tak for god vejledning og forslag.
Avatar billede repox Seniormester
11. januar 2011 - 08:27 #10
Du fik svar her...
Avatar billede Mik2000 Professor
11. januar 2011 - 14:10 #11
Hej

Hvis du har lavet nogle tilretninger, vil du så ikke kort skrive hvad du gjorde hvor det virkede?
Avatar billede nemlig Professor
11. januar 2011 - 18:03 #12
Det er blot nogle småting som nogle Tuborg-klammer mm. Jeg er på skitur og er hjemme torsdag. Så smider jeg lige koden.
Avatar billede Mik2000 Professor
14. januar 2011 - 10:24 #13
Hej

Kan man egentlig gøre det samme med jpg, gif, png osv

og kan man gøre så den finder format her automatisk, så man ikke skal kende typen:
header('Content-type: application/pdf');
    header('Content-Disposition: attachment; filename="downloaded.pdf"');
Avatar billede Mik2000 Professor
21. januar 2011 - 19:00 #14
Hej vil du smide det du brugte :)
Avatar billede Mik2000 Professor
26. februar 2011 - 02:03 #15
Vil du smide det hvis det virkede?
Avatar billede nemlig Professor
05. marts 2011 - 22:12 #16
Undskyld mit sene svar.
Jeg anvender 2 filer:
1 = lister filerne i min beskyttede mappe (dokumenter):
2 = Programkode, som beskrevet i denne tråd:
Begge filer ligger i samme mappe, fx. roden og den beskyttede mappe ligger så i en undermappe, som jeg kalder "dokumenter".
Dertil kommer .htaccess-filen som ligger i den beskyttede mappe.

FIL 1:
// open this directory
$myDirectory = opendir("dokumenter");

// get each entry
while($entryName = readdir($myDirectory)) {
    $dirArray[] = $entryName;
}

// close directory
closedir($myDirectory);

//    count elements in array
$indexCount    = count($dirArray);

// sort 'em
sort($dirArray);

// print 'em
print("<TABLE border=1 cellpadding=5 cellspacing=0 class=whitelinks>\n");
print("<TR><TH><span class='text3'>Filnavn</span></TH></TR>\n");
// loop through the array of files and print them all
for($index=0; $index < $indexCount; $index++) {
        if (substr("$dirArray[$index]", 0, 1) != "."){ // don't list hidden files
        print("<TR><TD><span class='text4'><a href='hentfil.php?req_file=$dirArray[$index]'>$dirArray[$index]</span></a></td>");
        print("</TR>\n");
    }
}
print("</TABLE>\n");

FIL 2:
<?php


$req_file = $_GET["req_file"];
$req_file = "dokumenter/".$req_file;

    if( file_exists($req_file) ) 
    {   
        header('Content-type: application/pdf');   
        header('Content-Disposition: attachment; filename="downloaded.pdf"');   
        echo file_get_contents($req_file); 
    }  else { 
        header("Location: file_not_found.php");
    }

?>
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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