Avatar billede lillebror Nybegynder
23. august 2004 - 14:08 Der er 25 kommentarer og
2 løsninger

Skjule billeder for offentligheden

Hejsa, jeg har været i gang med at lave et galleri, hvor hver bruger får tildelt sin egen mappe, der indeholder alle php filerne fra en skabelon. Udover disse filer bliver der oprettet en mappe til billederne, som brugeren nu får lyst til at uploade.

Problemet er bare at folk sagtens kan se billederne, det viste jeg egentlig godt da jeg lavede det, men jeg vil under ingen omstændigheder have billederne i databasen.

Så var det jeg kom i tanke om htaccess, er det muligt at smide en .htacces fil ind i /pictures/, så man sagtens kan se billederne via php'en, men ikke gennem direkte links?

Hvis man kan det, hvordan skal sådan et script så skrives?

Jeg er absolut ny til .htaccess så det skal højst sandsynligt skæres fuldstændigt ud i pap :)
Avatar billede sone Nybegynder
23. august 2004 - 14:12 #1
Den super-simple måde er at lave en tom index.php fil og ligge den i pictures-mappen.
Avatar billede g1um Nybegynder
23. august 2004 - 14:15 #2
jeg tror den bedste loesning vil vaere at lave en ny php script der henter billederne ud fra deres ID(hvis du har links i databasen). og viser dem til brugeren. Det er osse meget smart da du kan tjekke brugeren ved hjaelp af sessions.. Links til billeder vil dog vaere noget med: www.domain.com/pictures/showpic.php?ID=1231
Avatar billede Slettet bruger
23. august 2004 - 14:15 #3
sone: Den forhindrer ikke folk, der kender adressen i at linke til billedet (og få det set på den måde)
Avatar billede Slettet bruger
23. august 2004 - 14:18 #4
lillebror: Du kan nok få glæde af denne funktion: http://dk.php.net/manual/en/function.readfile.php
Avatar billede sone Nybegynder
23. august 2004 - 14:21 #5
Nej, det vil man aldrig kunne forhindre hvis man kender ID - men nu ville han jo også bare spærre for dir-listing (som jeg læser det).
Avatar billede nyst Nybegynder
23. august 2004 - 14:22 #6
du lægger en .htaccess fil i roden af dit webhotel og den skal så se sådan ud

.htacces fil indhold

SetEnvIfNoCase Referer "^http://www\.ditdomæne\.dk/" local_ref=1
<FilesMatch "\.(gif|jpg)">
    Order Allow,Deny
    Allow from env=local_ref
</FilesMatch>

Husk at rette ditdomæne til din adresse, hvis ikke .dk så retter du også bare den.

Nu kan der ikke ses billeder uden de har et link fra en eller anden side fra dit webhotel, dvs. denne gør også at andre ikke kan linke fra deres sider.

:-)
Avatar billede lillebror Nybegynder
23. august 2004 - 14:27 #7
Sone og g1um, i skyder i den grad ved siden af!

Sone:
Selvom man går ind på /pictures/ og ser en tom index fil, kan man jo sagtens gå ind på /pictures/hej.jpg og se et billedere

g1um:
Jeg tror du foreslår mig noget, som du ikke engang ved hvordan virker selv. Den måde det du viser der, er skruet sammen på, er netop at hente billederne udfra databasen, og det har jeg nævnt at jeg ikke er interesseret i.

sandbox:
Jeg har lidt på fornemmelsen at readfile() også bruges til at hente det ud af databasen.

Jeg vil hellere høre et forslag med htaccess, da jeg har på fornemmelsen at det er dét der virker.
Avatar billede g1um Nybegynder
23. august 2004 - 14:39 #8
du har forstaet mig helt forkert. Jeg ga ud fra at du har en database med links til billeder, og billederne ligger i mapper ikke direkte i mysql.

jeg synes personlig ikke at .htaccess  vil vaere den bedste losning for dig, da du stadig kan se billedet ved at skrive hele stigen.
Avatar billede lillebror Nybegynder
23. august 2004 - 14:41 #9
Desværre nyst, det havde ikke den ønskede effekt.
Det var stadig muligt at se billedet hvis man linkede direkte, derimod ødelagde det muligheden for at man kunne se enkelte billeder gennem mit php script.

Kan det virkelig passe, at der ikke findes en .htaccess metode der gør det muligt for php at se billeder, men umuligt for direkte links? (Skal selvfølgelig kun gælde den mappe filen ligger i)
Avatar billede g1um Nybegynder
23. august 2004 - 14:42 #10
jeg glemte lige at sige at da filen er forhindret fra +Indexes(dvs Allow.Deny), kommer der en error i din apache_error.log. Har lige testet. 

[Mon Aug 23 14:42:44 2004] [error] [client 127.0.0.1] client denied by server configuration: /home/glum/www/pics/linux.gif
Avatar billede x4all_dk Nybegynder
23. august 2004 - 14:42 #11
Du kan smide en .htaccess fil i dit \billed\ med:
<directory>
    Order Allow,Deny
    Deny from all
</directory>
Hvis du har billederne under en brugerkonto.

Ellers kan du placere filerne uden for www. - f.eks. har du:
\public_html\
\billeder\

Hvis du har billederne i \billeder\ så kan disse IKKE linkes eksternt fra.
$sti = "../../billeder/";
Du kan nu hente dem via PHP. <img src='$sti.$billed'>

Jeg har anvendt nedereste eksempel selv, og det virker!
Avatar billede lillebror Nybegynder
23. august 2004 - 14:43 #12
g1um, jeg har mit link i databasen, og billedets navn består af 8 tilfældige, men gyldige tegn.

Jeg tror faktisk du ikke selv er klar over hvad du foreslår, for jeg ser ingen logik i din løsning, for den vil ikke fjerne muligheden for at linke direkte
Avatar billede nyst Nybegynder
23. august 2004 - 14:48 #13
ja hvis du bruger den jeg gav dig før så kan der ikke linkes eller skrives direkte i browseren
Avatar billede lillebror Nybegynder
23. august 2004 - 14:50 #14
Med risikoen for at virke en anelse besværlig, så er det ikke helt det jeg beder om x4all_dk. Med din løsning kan jeg ikke vise billederne gennem php overhovedet, men rigtigt nok kan jeg heller ikke følge det direkte link.

Dit andet forslag vil kræve meget arbejde med at omstrukturere min kode, så jeg vil hellere helt undvære muligheden, hvis det er den eneste løsning der virker på min problemstilling.

Det jeg helst vil vide er: kan det lade sig gøre at smide en .htaccess fil ind i mapperne /pictures/ under hver af brugernes mapper, således at billederne kan læses af php, men ikke af et direkte link
Avatar billede g1um Nybegynder
23. august 2004 - 14:50 #15
lillebror: _jeg er helt positiv og klar over den her løsning_.  den php script som henter billeder fra en mappe som almindelig bruger ikke kender,  kan tjekke brugernes session. og hvis brugeren er "authentificeret" kan den visse billede (ved hjaelp af readfile), hvis ikke kan den vise en anden billede hvor der sta ("du har ikke adgang til at se billedet"). det er den her losning jeg selv bruger. og den virker.
Avatar billede nyst Nybegynder
23. august 2004 - 14:55 #16
ja du lægger den jeg skrev i hver mappe men med rettet link til mappe feks.

SetEnvIfNoCase Referer "^http://www\.ditdomæne\.dk/image1/" local_ref=1
<FilesMatch "\.(gif|jpg)">
    Order Allow,Deny
    Allow from env=local_ref
</FilesMatch>

eller

SetEnvIfNoCase Referer "^http://www\.ditdomæne\.dk/image2/" local_ref=1
<FilesMatch "\.(gif|jpg)">
    Order Allow,Deny
    Allow from env=local_ref
</FilesMatch>

osv

:-)
Avatar billede nyst Nybegynder
23. august 2004 - 14:56 #17
hvis du anvender feks .bmp billeder tilføjer ud i denne

<FilesMatch "\.(gif|jpg|bmp)">
Avatar billede lillebror Nybegynder
23. august 2004 - 15:06 #18
nyst, din metode gør at man ikke kan få adgang via PHP, og heller ikke gennem direkte link, jeg vil gerne have adgang via PHP, men ikke via direkte link...
Avatar billede sone Nybegynder
23. august 2004 - 15:11 #19
Det kan man ikke spærre for... enten kan en browser hente billedet (via eksakt URL) eller også kan den ikke
Avatar billede nyst Nybegynder
23. august 2004 - 15:18 #20
så må du uddybe 'adgang via php' !!!
Avatar billede lillebror Nybegynder
23. august 2004 - 15:23 #21
Altså, når man kommer ind på pictures.php, så bliver det tjekket om man har rettigheder til at se billedet (Via en mysql database).

Hvis man har rettighederne, så får man vist billedet, hvis man ikke har så bliver billedet ikke vist.

Mit problem ligger så i, at hvis en person har rettighederne til at se et billede, så kan han tage det direkte link til billedet og sende det til hvem han har lyst, og de vil kunne se det. Det er DET jeg gerne vil undgå
Avatar billede nyst Nybegynder
23. august 2004 - 15:25 #22
hvis du har en mappe med en .php fil hvor der er link til et foto ellere noget grafik for den sags skyld i samme eller anden mappe, så kan der kun ses det foto der linkes til i .php-filen og der kan IKKE skrives i browseren.

Feks hvis du nu har en fotoserier foto01, foto02 osv til foto99.jpg,
så er det jo nemt at gætte hvis man har linket til foto01.jpg, men htaccess gør at du ikke kan skrive foto02.jpg hvis der ikke er linket til det i .php-filen.
Avatar billede nyst Nybegynder
23. august 2004 - 15:28 #23
jamen det er jo en helt anden snak, så skal du lave noget der checker den enkeltes IP-adresse og kun give adgang for den og ikke andre, det er jo så ikke sleve billedet du skal beskytte men brugeren til din mappe og kun give adgang for hans IP og her hjælper det ikke at lave password osv. det skal være Ip eller funker det ikke.
Avatar billede lillebror Nybegynder
23. august 2004 - 15:28 #24
nyst, mine filer er ikke nummererede, derfor gætter folk sig ikke bare frem til billederne, de er nødt til at kende en der har adgang, for at kunne se billedet.

Jeg ville bare gerne undgå, at man kunne dele billederne så nemt med folk, hvis man har fået adgang til nogle private billeder. Det lyder desværre som om min problemstilling er umulig at løse som den er lige nu.

Smid et svar, så deler vi pointene
Avatar billede nyst Nybegynder
23. august 2004 - 15:37 #25
ok, men tænk på IP-løsning, dog kan du ikke forhindre at der deles ud, vedkommende kan jo bare gemme selve fotoet og lægge ud eller sende *S*
Avatar billede nyst Nybegynder
23. august 2004 - 15:38 #26
eller prøv at kigge på denne side:

http://apache-server.com/tutorials/ATimage-theft.html
Avatar billede Slettet bruger
23. august 2004 - 21:49 #27
Den er ikke umulig, og du har brug for både en .htaccess og readfile(). Og det kræver faktisk ikke engang så meget ændring i din eksisterende kode.

På din almindelige side skal du bruge session_start(); et sted i toppen af filen. (Før udskrift og html-koder og alt sådan noget.)

Så skal du sætte en session-variabel: $_SESSION['vis_billed']=true;

Dine billedlink skal pege på visbilled.php?id=$id hvor du bruger id-nummeret fra databasen - eller hvis alle billederne ligger i samme mappe kan du også bruge filnavnet.

Så skal visbilled.php se nogenlunde således ud:

<?php

if(isset($_SESSION['vis_billed']) && $_SESSION['vis_billed']===true){
  // Kontroller om det er et gyldigt filnavn eller slå filnavn op i DB.
  header("Content-Type: image/jpeg");
  readfile("/sti/til/billedmappe/" . $filnavn);
} else {
  header("HTTP/1.0 403 Forbidden");
  ?>
    <html>
    <head><title>403 Forbidden</title><head>
    <body><p>Du kan kun se billedet fra sider på samme server.</p></body>
    </html>
  <?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