plaatje pas zichtbaar na inloggen
Ik vraag me iets af. Ik denk dat het niet kan, maar wie weet heeft iemand hier toch ineens een geweldige oplossing.
Stel ik heb in m'n publieke www directory een map "membercontent". In die map staat een plaatje dat ik zo kan aanroepen:
www.mijnsite.nl/membercontent/eenplaatje.jpg
Is het nu zo te maken dat als je bent ingelogd (met een gebruikersnaam en wachtwoord) dat het plaatje dan zichtbaar wordt, en dat als je niet bent ingelogd het lijkt alsof het plaatje niet bestaat?
Het gaat dus om een rechtstreekse aanroep van het plaatje:
www.mijnsite.nl/membercontent/eenplaatje.jpg
(en dus NIET zoiets als www.mijnsite.nl/membercontent/toonplaatje.php?plaatje=eenplaatje.jpg)
Zelf heb ik nog nooit hier mee gewerkt maar wat mij lijkt is dat dit via .htacces (mod_rewrite) kan. Is het een afbeelding (png, gif etc) dan vang je die op met je .htacces en laat je achter de schermen naar een .php bestand verwijzen? Dan kun je in dat .php bestand kijken of gebruiker is ingelogd of niet. Of denk ik nu verkeerd?
www.mijnsite.nl/membercontent/eenplaatje.jpg
Ik denk dat het wel kan als je het plaatje niet rechtstreeks aanroept, maar via een php-pagina. Alleen moet je alle plaatjes dan "renderen" en dat wil ik niet. Dus vandaar vraag ik me af of zoiets mogelijk is met een rechtstreekse aanroep op het bestand: Gewijzigd op 07/06/2012 15:14:43 door Ozzie PHP
Denk zoals ik zei. Je roept het gewoon hard aan maar links met via mod_rewrite door naar checkimage.php?file=afbeelding zonder dat de gebruiker dat in de url ziet.
Ik denk eigenlijk dat dat niet kan, maar heb je wellicht een voorbeeldje?
Ik kwam dit tegen in een script voor watermerken in afbeeldingen maar ik denk dat je deze opzich wel kan ombouwen naar wat jij wil:
Code (php)
1
RewriteEngine on RewriteRule ^tutorials/(.*).jpg /home/...absolute path.../public_html/watermerk.php?img=%{REQUEST_FILENAME}
Hier worden alleen afbeeldingen in de map tutorials van een watermerk voorzien, zo kan je dus ook mappen met afbeeldingen maken die voor iedereen zichtbaar zijn.
Gewijzigd op 07/06/2012 15:20:48 door gerhard l
Thanks Gerhard. Maar stel nu dat iemand is ingelogd, dan moet je alsnog via php het plaatje renderen neem ik aan?
Eerlijk gezegd denk ik namelijk dat het antwoord inderdaad de modrewrite optie is die via een php pagina het plaatje vanaf een niet direct openbare locatie haalt. Met renderen dus...
Maar nu kan ik dat wel beveiligen, maar als dat inhoudt dat alle layout plaatjes telkens moeten worden gerenderd dan denk ik dat dat een vrij zware belasting is. Vandaar dat ik me dus afvroeg of het ook kon met rechtstreekse aanroepen.
Waarom zou je niet willen dat mensen ontdekken dat de website met jou CMs is gemaakt? Dat is toch juist extra reclame?
www.zomaareensite.nl/ozziescms/geheimplaatje.jpg
Maar nogmaals dit gaat natuurlijk heel erg ver. Ik zit me nu ook te bedenken dat er een logingedeelte moet komen en dit kan natuurlijk niet afgeschermd zijn, dus wat dat betreft kan het sowieso niet lukken wat ik in gedachten had.
Maar zoasl ik al zei... het was gewoon even iets wat door m'n gedachten flitste en ik was benieuwd of het haalbaar was.
Ja, eigenlijk zat ik meer te denken aan veiligheid om eventuele hackpogingen tegen te gaan. Wel even een extreem voorbeeldje nu, maar het gaat om het idee. Stel mijn cms zou op heeeel veel sites gebruikt gaan worden (dream on... ;-)) en een hacker zou een lek vinden. Vervolgens zou ie dan andere sites kunnen zoeken die ook met mijn cms gemaakt zijn door bijv. urls te testen: Maar nogmaals dit gaat natuurlijk heel erg ver. Ik zit me nu ook te bedenken dat er een logingedeelte moet komen en dit kan natuurlijk niet afgeschermd zijn, dus wat dat betreft kan het sowieso niet lukken wat ik in gedachten had.
Maar zoasl ik al zei... het was gewoon even iets wat door m'n gedachten flitste en ik was benieuwd of het haalbaar was.
Gewijzigd op 07/06/2012 16:08:22 door Ozzie PHP
Toch vind ik het leuk dat je dit onderwerp op het forum brengt. Op sommige fora's zie ik dat ook wel eens dat alleen bepaalde leden een afbeelding kunnen zien en anderen een standaard afbeelding krijgen te zien, maar had me nog nooit afgevraagd hoe en dat zou zo dus mogelijk zijn;)
Code (php)
Volgens mij werkt dat niet, want je gaat nu een plaatje in een plaatje echo'en :)
Dat plaatje zou je dan dus moeten renderen.
URL wordt dan:
http://jouwsite.nl/cache/rg37gAg
Met je framework maak je een route naar een ImageController / FileController. En in de ImageController / FileController handel je alles af.
Niels
Je kan toch ook de icons van de admin in een centrale /images/ of templates/img map plaatsen? Als iemand ze ontdekt is het toch niet zo spannend, omdat je er toch geen verwijzingen hebt naar de admin-directory.
Scheelt ook nog parsetime ;-)
Niels Kieviet op 14/06/2012 13:28:09:
Maak van de naam van je plaatje + extensie een hash. Stop die hash i.c.m de filename de extensie in de database.
URL wordt dan:
http://jouwsite.nl/cache/rg37gAg
Met je framework maak je een route naar een ImageController / FileController. En in de ImageController / FileController handel je alles af.
Niels
URL wordt dan:
http://jouwsite.nl/cache/rg37gAg
Met je framework maak je een route naar een ImageController / FileController. En in de ImageController / FileController handel je alles af.
Niels
Niels, op zich leuk, maar dan kun je het plaatje toch nog steeds direct aanroepen? :-/
Ozzie PHP op 14/06/2012 14:02:54:
Niels, op zich leuk, maar dan kun je het plaatje toch nog steeds direct aanroepen? :-/
Wat je zou kunnen doen is afbeeldingen een prefix geven (per site) maar deze d.m.v. rewriteconditions en -rules omzetten naar de daadwerkelijke locatie. In het cms gebruik je dan verwijzingen als:
mijnsite_bg.jpg
jouwsite_bg.jpg
nogeensite_bg.jpg
***_bg.jpg
En allen verwijzen dan weer naar www.jouwcms.nl/images/bg.jpg
Succes met het uitwerken :-)
.htaccess in de map van de plaatjes (of een map hoger als dit zo uitkomt, maakt voor de werking van het script niet uit)
checksession.php, in dezelfde map als de .htaccess plaatsen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
// start session
session_start();
// check if the user is logged in - add extra validation to check if the image is viewable for this user
if (isset($_SESSION['logged_in'], $_GET['path']) && $_SESSION['logged_in'] && is_readable($_GET['path'])) {
// get mimetype of the file and send header
header("Content-type: " . mime_content_type($_GET['path']));
// put through the file to the users client without loading it first into memory
readfile($_GET['path']);
// if user is not able to see it, or if the image does not exist, show a general message
} else {
echo 'You should be logged in to view this image, or this image is not yours.';
// send 404 errors so google wont index it
header("HTTP/1.0 404 Not Found");
header("Status: 404 Not Found");
}
?>
// start session
session_start();
// check if the user is logged in - add extra validation to check if the image is viewable for this user
if (isset($_SESSION['logged_in'], $_GET['path']) && $_SESSION['logged_in'] && is_readable($_GET['path'])) {
// get mimetype of the file and send header
header("Content-type: " . mime_content_type($_GET['path']));
// put through the file to the users client without loading it first into memory
readfile($_GET['path']);
// if user is not able to see it, or if the image does not exist, show a general message
} else {
echo 'You should be logged in to view this image, or this image is not yours.';
// send 404 errors so google wont index it
header("HTTP/1.0 404 Not Found");
header("Status: 404 Not Found");
}
?>
info: readfile opent een bestand en stuurt het meteen door naar de browser, zonder het bestand in het geheugen van de server te laden wat snelheid vergroot.
Gewijzigd op 16/06/2012 01:14:09 door Terence Hersbach