Avatar billede dj-sejler Praktikant
23. oktober 2012 - 19:28 Der er 17 kommentarer

htaccess - kun tillad download gennem bestemt fil

Jeg tillader på min side at folk kan se og downloade en række pdf-filer - men jeg vil gerne sikre at de ikke bliver vidst direkte fra stien men kun når du bliver kaldt gennem min "download.php" og "show.php" fil

Er det ikke noget man kan via htaccess og i givet fald hvordan?
Avatar billede amews_aj Nybegynder
23. oktober 2012 - 20:43 #1
Placer filerne i en undermappe, og smid så en .htaccess fil i den undermappe med indholdet

Order Allow,Deny
Allow from none
Deny from all
Avatar billede rix Praktikant
23. oktober 2012 - 20:46 #2
Avatar billede amews_aj Nybegynder
23. oktober 2012 - 20:48 #3
Glem det, der er ikke noget "none", og du har ikke brug for at specificere ordnen, så derfor skal der bare stå

Deny from all

Beklager forvirringen :D
Avatar billede dj-sejler Praktikant
23. oktober 2012 - 21:03 #4
Der ser godt ud!!

MEN

Jeg læser pdf'en via <embed type="application/pdf" src="">
det virker ikke på den måde.

OG

kan man få den til at indlæse en "fejlside" eks: error.php i stedet for serveres grimme grimme standardside

Husk at "svare" også ;)
Avatar billede amews_aj Nybegynder
23. oktober 2012 - 21:18 #5
Mht. fejlside kan du blot tilføje
ErrorDocument 403 /din/side/her.html

Hvis du embed'er på den måde er det browseren der laver en ny request til serveren for at få fat på PDF dokumentet. Så du kan ikke vide om brugeren forsøger at tilgå den direkte, eller om det bare er browseren der henter den pga. <embed..>

Måske du kunne fortælle formålet? At du ikke vil have at folk linker direkte til PDF'en ?

Den første løsning kan du bruge til at indhente statistik om hvem der tilgår PDF-dokumentet, ved altid at køre et php-script for at loade filen.
Avatar billede dj-sejler Praktikant
23. oktober 2012 - 21:28 #6
Hvis der er andre eller bedre løsninger til har "indhente" pdf'en på siden så er jeg åben - det var den jeg kunne finde ud af ;)

Men jeg vil ikke have at "alle" kan hente filerne da det i nogen tilfælde ikke er i mine brugeres interesse.
Det var derfor jeg tænkte om man kunne tillade en bestemt fil at hente ind
Avatar billede amews_aj Nybegynder
23. oktober 2012 - 21:33 #7
Der er nogen her der vist diskuterer noget lignende http://atutor.ca/view/7/15881/1.html

Jeg har desværre ikke selv tid til at se nærmere på det lige nu.
Avatar billede moddi100 Seniormester
23. oktober 2012 - 22:51 #8
Det kan laves med php sessions. Nu antager jeg at der er tale om PHP, da du jo snakker om apache. Princippet er, at den besøgende først skal besøge siden show.php, hvorefter en session sættes og denne giver så adgang til pdf-filen.

Som omtalt tidligere gemmer du alle pdf-filer i en mappe kaldet "pdf". I denne laver du en .htaccess-fil:

.htaccess
Order Allow,Deny
Deny from all


show.php
// Her giver vi tilladelse til download af hemmeligt.pdf

session_start();

// Lav array hvis det ikke eksisterer
if(!isset($_SESSION['allow_download']))
  $_SESSION['allow_download'] = array();

// Tilføj den ønskede fil til ovenstående array
$_SESSION['allow_download'][] = 'hemmeligt.pdf';


I din embed laver du det så således at alle filer hentes fra download.php?fil=FILNAVN

På denne måde kan vi nægte eller tillade adgang til de enkelte filer.

download.php
session_start();

// Hent filnavn (husk at vi ikke kan stole på dette input!)
$fil = basename($_GET['fil']);

if(in_array($fil, (array)$_SESSION['allow_download']))
{
  echo readfile( 'pdf/' . $fil);
  exit;
} else {
  die("Adgang nægtet");
}


Bemærk at ovenstående er uprøvet
Avatar billede amews_aj Nybegynder
23. oktober 2012 - 23:07 #9
Selvom det måske ikke er et stort problem i praksis, så betyder det stadigvæk at brugeren kan tilgå filerne ved direkte links så snart brugeren har været inde på siden en gang (siden sidste genstart af browser).
Avatar billede moddi100 Seniormester
24. oktober 2012 - 12:54 #10
Det kan jo så også begrænses hvis man sletter sessionen når adgang er givet.

I download.php
session_start();

// Hent filnavn (husk at vi ikke kan stole på dette input!)
$fil = basename($_GET['fil']);

// Find index for den angivne fil
$key = array_search($fil,(array)$_SESSION['allow_download']);

// Tjek om filen er i det angivne array
if($key !== false)
{
  // Fjern adgang til filen efter at den nu er hentet 1 gang
  unset($_SESSION['allow_download'][$key]);
  echo readfile( 'pdf/' . $fil);
  exit;
} else {
  die("Adgang nægtet");
}
Avatar billede amews_aj Nybegynder
24. oktober 2012 - 13:02 #11
Medmindre man vil vise to dokumenter på samme side. :)
Avatar billede moddi100 Seniormester
24. oktober 2012 - 22:43 #12
Ved brug af arrays er dette jo netop løst, se koden igen ovenfor. For hver fil der ønskes adgang til, skrives jo blot:

$_SESSION['allow_download'][] = 'hemmeligt.pdf';
Avatar billede amews_aj Nybegynder
24. oktober 2012 - 23:08 #13
Det har du ret i - læste slet ikke koden :)
Smart lavet :)
Avatar billede dj-sejler Praktikant
29. oktober 2012 - 20:54 #14
Jeg har nu løst sagen med jeres hjælp! moddi100 må meget gerne lægge et svar...

Jeg har lige et tillægsspørgsmål
har det der nu står i htaccess'en indflydelse på upload til mappen?
og hvordan tillader jeg så det igen?

**** .htaccess

<FilesMatch ".(pdf)$">
Order Allow,Deny
Deny from all
</FilesMatch>
Avatar billede amews_aj Nybegynder
29. oktober 2012 - 21:30 #15
Nej det skulle ikke have indflydelse :)
Avatar billede dj-sejler Praktikant
29. oktober 2012 - 21:36 #16
nej det har jeg også lige fundet ud af - det virker - det var andre fejl, der gav fejl

Af hjertet tak for hjælpen!
Avatar billede moddi100 Seniormester
08. november 2012 - 18:25 #17
Og et lidt forsinket svar :)
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
Kurser inden for grundlæggende programmering

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