fotomap blokkeren maar foto's wel zichtbaar maken in chat

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Christian k

christian k

03/05/2014 10:50:55
Quote Anchor link
hallo iedereen,

Ik zit met het volgende probleem: in mijn chatsysteem kunnen mensen foto's naar elkaar sturen
die foto's zitten in de map picture/ maar hoe kan ik ervoor zorgen
dat de map niet zichtbaar is voor iemand (de map geblokkeert in .htacces) maar wel de foto's die je zelf verstuurd of ontvangt zichtbaar maakt in de chat.
weet iemand hoe ik dat probleem kan oplossen?
 
PHP hulp

PHP hulp

24/04/2024 05:36:17
 
- Ariën  -
Beheerder

- Ariën -

03/05/2014 10:54:31
Quote Anchor link
deny from all in .htaccess die in de map staat.

En verder de foto's via readfile() ophalen als iemand er toestemming voor heeft (inloggen).
 
Bart V B

Bart V B

03/05/2014 11:01:32
Quote Anchor link
Wat je ook kan doen is een lege index.php in de map zetten.
 
- Ariën  -
Beheerder

- Ariën -

03/05/2014 11:05:02
Quote Anchor link
Maar dat verhindert niet dat iedereen, als men de link ernaar toe weet, de foto's zomaar op kan halen.
met mijn oplossing wordt dat verhindert, en leg je de beveiliging bij PHP.
 
Christian k

christian k

03/05/2014 14:21:16
Quote Anchor link
oke maar hoe echo je een foto in html dan?
want je moet een image in html toch met src="" tags op de pagina zetten?
 
- Ariën  -
Beheerder

- Ariën -

03/05/2014 15:00:11
Quote Anchor link
De foto ophalen via image.php, waar je met readfile() moet werken.
 
Wim E

Wim E

03/05/2014 18:24:12
Quote Anchor link
Moet je inloggen op het deel of dat niet?
Optie zou zijn om een private map te maken, en doormiddel van service een foto op te halen.
Door een bestandsnaam een hash van te maken en deze op te slaan kan er niet zomaar gegokt worden wat het bestandje heet.
 
Christian k

christian k

03/05/2014 18:37:06
Quote Anchor link
De bestandsnaam is
(id van de user)-(time() van het uploaden)- (ramdom getal).(extentie)
nee je deelt een foto en alleen je vrienden moeten het kunnen zien
maar nu kun je alle fotos zien door in de map /picture/ te kijken
 
- Ariën  -
Beheerder

- Ariën -

03/05/2014 19:15:51
Quote Anchor link
Heb je al wat geprobeerd a.h.v de gegeven tips? ;-)
 
Frank Nietbelangrijk

Frank Nietbelangrijk

03/05/2014 19:21:08
Quote Anchor link
Christian k op 03/05/2014 18:37:06:
nee je deelt een foto en alleen je vrienden moeten het kunnen zien
maar nu kun je alle fotos zien door in de map /picture/ te kijken


En hoe moet de server (PHP) weten wie ik ben en wie mijn vrienden zijn?
Een chat systeem zonder inlog? ga je niet menen hoop ik

Maar goed het onderwerp is best interessant. Zoals Aar al heeft gezegd dien je de foto's te uploaden naar een directory die niet publiekelijk toegankelijk is.

Vervolgens zitten we met het probleem dat als we een image tag in de html plaatsen de browser zal proberen de afbeelding van de server te halen.

Dat los je als volgt op:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<img src="image.php?filename=31-2563659-45865.png" />


WAAAAAAAT? ja, een PHP script dat geen HTML teruggeeft maar een afbeelding.

Hoe je dat dan moet doen? Het basis idee is niet al te moeilijk:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
// image.php

$imageDir = '/images';

// laat de browser weten dat we een .png bestand terugsturen
header('Content-Type: image/png');

// als er een filename is opgegeven en deze ook nog eens bestaat.
if(isset($_GET['filename']) && file_exists($imageDir . '/' . $_GET['filename']))
{

    // spuug de inhoud van het image bestand uit
    echo file_get_contents($imageDir . '/' . $_GET['filename']);

    // taak volbracht
    exit();
}


// wat moeten we doen als de opgevraagde afbeelding niet aanwezig is?
// misschien een standaard afbeelding teruggeven?

echo file_get_contents($imageDir . '/notfound.png');

?>


Zo nu je weet hoe dit werkt moet je het alleen nog wat uitbreiden. Als eerste werkt dit voorbeeld alleen maar met png bestanden. Dus dat zul je verder moeten uitbreiden.
Dan is het nog steeds voor iedereen mogelijk om alle afbeeldingen te downloaden dus zul je een constructie moeten maken die controleert of de gebruiker de opgevraagde afbeelding wel mag zien
Gewijzigd op 03/05/2014 19:56:13 door Frank Nietbelangrijk
 
Christian k

christian k

03/05/2014 20:36:45
Quote Anchor link
dit is de image.php file:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
session_start();
function
sendfile($file)
{

     $exte = explode(".", $file, 2);
     $ext  = end($exte);
     header('Content-Type: image/' . $ext);
     if(isset($_GET['filename']) && file_exists($imageDir . '/' . $_GET['filename']))
     {

          echo file_get_contents('picture/' . $file);
     }

     else
     {
             echo file_get_contents('picture/notfound.jpg');
     }
}


include_once 'php/check.php';
include_once 'php/connect.php';
$user_id   = mysqli_real_escape_string($con, $_SESSION['user_id']);
$file      = mysqli_real_escape_string($con, $_GET['picture']);
$fileid    = explode("-", $file, 2);
if($fileid == $user_id)
{

     sendfile($file);
     exit();
}

$select    = "SELECT * FROM friends WHERE user_id='$user_id' AND friend_id='$file_id' OR user_id='$file_id' AND friend_id='$user_id'";
$query     = mysqli_query($con, $select);
if($query != true)
{

     echo 'Error: ' . mysqli_error($con);
}

else
{
     if(mysqli_num_rows($query) != 0)
      {

               sendfile($file);
      }

      else
      {
               echo 'deze foto is niet voor U bedoelt!';
      }
}


?>

maar hoe moet je in .htaccess de map picture/ blokkeren maar hoe moet dat?
ik heb al even op het internet gekeken maar ik vind alleen maar hoe je files moet blokkeren.

en dan heb ik nog een vraag is de file die ik nu heb veilig?
er kunnen bugs in zitten ik heb hem nog niet getest alleen even snel getypt.
 
Wim E

Wim E

03/05/2014 20:40:28
Quote Anchor link
- Aar - op 03/05/2014 10:54:31:
deny from all in .htaccess die in de map staat.

En verder de foto's via readfile() ophalen als iemand er toestemming voor heeft (inloggen).


Volgens mij was het net al aangegeven in de eerste post van Aar...
htaccess en deny from all...just Google...

En wat betreft je code...wellicht idee om te escapen van je data?
Daarnaast variablen los maken van je strings (bijv: "Dit is " . $var . " en ga maar verder")
Gewijzigd op 03/05/2014 20:41:28 door Wim E
 
Frank Nietbelangrijk

Frank Nietbelangrijk

03/05/2014 21:06:45
Quote Anchor link
Het heeft niet zo veel zin om fouten te echoën in een script dat normaal gesproken een afbeelding teruggeeft.
In de testomgeving kan het soms wel handig zijn maar in de live-omgeving zou ik er voor kiezen om enkel een
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php header("HTTP/1.0 404 Not Found"); ?>
terug te geven.

Toevoeging op 03/05/2014 21:08:15:

lees dit topic ook even: http://www.phphulp.nl/php/forum/topic/file-permissions/94783/last/
 
Christian k

christian k

04/05/2014 10:25:55
Quote Anchor link
ik heb dit nu in mijn .htaccess
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<Directory /picture/>
order allow,deny
deny from all
</Directory>

maar nu krijg ik de melding 500 Internal Server Error te zien weet iemand wat er fout is in de .htaccess?
@wim wat bedoel je met escapen van je data? want er is toch allenmaar een mysqli_real_escape_string() nodig
want ik de data gaat alleen maar in de database.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

04/05/2014 10:58:23
Quote Anchor link
alleen regel drie hoeft in je .htaccess bestand. het bestand moet in de directory komen die je wilt blokkeren
 
Donny Wie weet

Donny Wie weet

04/05/2014 13:44:45
Quote Anchor link
Frank Nietbelangrijk op 03/05/2014 19:21:08:
Maar goed het onderwerp is best interessant. Zoals Aar al heeft gezegd dien je de foto's te uploaden naar een directory die niet publiekelijk toegankelijk is.


De methode die Frank aangeeft werkt fantastisch. Deze gebruik ik zelf ook. Was al aan het zoeken voor het script (staat nog ergens op mn laptop). Zeker een aanrader
 
Christian k

christian k

04/05/2014 14:12:22
Quote Anchor link
de blokkering werkt maar kan ik ook zorgen dat je doorgestuurt word als je in die map gaat?
 
Frank Nietbelangrijk

Frank Nietbelangrijk

04/05/2014 15:20:16
Quote Anchor link
Ja dat kan met rewrite rules. http://www.addedbytes.com/articles/for-beginners/url-rewriting-for-beginners/

Overigens doe je dat vanuit een hoger gelegen directory dus wat je nu hebt kun je behouden
Gewijzigd op 04/05/2014 15:21:11 door Frank Nietbelangrijk
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.