fotomap blokkeren maar foto's wel zichtbaar maken in chat
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?
En verder de foto's via readfile() ophalen als iemand er toestemming voor heeft (inloggen).
Wat je ook kan doen is een lege index.php in de map zetten.
met mijn oplossing wordt dat verhindert, en leg je de beveiliging bij PHP.
want je moet een image in html toch met src="" tags op de pagina zetten?
De foto ophalen via image.php, waar je met readfile() moet werken.
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.
(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
Heb je al wat geprobeerd a.h.v de gegeven tips? ;-)
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
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:
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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');
?>
// 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
Code (php)
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
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!';
}
}
?>
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.
- 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).
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
In de testomgeving kan het soms wel handig zijn maar in de live-omgeving zou ik er voor kiezen om enkel een
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/
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.
alleen regel drie hoeft in je .htaccess bestand. het bestand moet in de directory komen die je wilt blokkeren
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
de blokkering werkt maar kan ik ook zorgen dat je doorgestuurt word als je in die map gaat?
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
Ja dat kan met rewrite rules. 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