[PHP] Securitycheck inbouwen in plaatjes

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 10-09 11:45
Ik ben bezig met een fotosite. Ik zet alle foto's bij elkaar in 1 directory. In de database worden de bestandsnamen gezet met eventuele extra info. Dan maak ik een album aan en daarin plaats ik al deze id's die ook in de db staan.

Omdat ik niet wil dat iedereen alle foto's kan zien heb ik een inlogsysteem gemaakt. Bij het inloggen worden alle albums waar je recht op hebt in een sessie gezet en zo worden alleen de albums weergegeven die in je sessievariabele staan.

De plaatjes worden aangeroepen d.m.v.

code:
1
image.php?image=42312&size=medium


Dit php bestand opent het plaatje en kijkt of er een bepaalde maat aanwezig is (small of medium) zo niet, dan maakt hij er eentje aan en schrijft hem weg voor toekomstig gebruik.

Sommige albums zijn publiekelijk toegankelijk en sommige alleen voor ingelogde gebruikers met rechten op dat album.

Nu is het probleem dat als je een plaatje rechtstreeks aanroept d.m.v. image.php je de rechten dus omzeilt. Ik moet dus in de image.php ook een check doen of de huidige gebruiker recht heeft om het plaatje te bekijken.
Dan zou ik dus eerst moeten kijken of het plaatje voorkomt in een publiek album, dan kijken in welke albums de gebruiker zit. En kijken of dat plaatje in die albums voorkomt. En dat voor elk plaatje wat weergegeven wordt. Dit zijn gemiddeld zo'n 50 foto's per album. Lijkt me niet echt een slimme oplossing.

Heeft iemand een beter idee?

Acties:
  • 0 Henk 'm!

  • GraasGast
  • Registratie: Oktober 2000
  • Laatst online: 02-09 19:22

GraasGast

Analogue Heaven

Je zou elke keer dat een plaatje word aangeroepen een unieke hash kunnen genereren met mt_rand en md5. Die zet je dan in je html pagina (<img src="image.php?hash=dh35r78...) en in de database, en image.php checkt dan of die hash in de database staat. Zo ja laat hij het plaatje zien en verwijderd hij de record, zo nee laat hij hem niet zien...

[ Voor 4% gewijzigd door GraasGast op 30-06-2003 16:33 ]


Acties:
  • 0 Henk 'm!

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 10-09 11:45
Ja, maar als iemand dan de complete URL met hash weet kan hij ook het plaatje vinden.

Acties:
  • 0 Henk 'm!

  • muis
  • Registratie: Oktober 2001
  • Laatst online: 18-11-2022
Je kan bij de foto het bijbehorende album halen uit de database om vervolgens te kijken of de gebruiker er rechten tot heeft?
Dat lijkt me (afhankelijk van je DB design) een quesie van 1 query

Een vergissing is menselijk maar om er een puinhoop van te maken heb je een computer nodig (met mij erachter)


Acties:
  • 0 Henk 'm!

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 05-10-2024
Of je zet de bestanden in een directorie die niet publiekelijk toegankelijk is en laat het plaatje pas zien wanneer de gene die het plaatje wil zien de benodigde rechten heeft. Dit kan met bijvoorbeeld fpassthru.
PHP:
1
2
3
4
5
6
<?PHP 
$filename=$file; // string constant contain complete path to img file 
$fp=fopen($filename, "rb"); 
header( "Content-type: image/jpeg\nContent-Disposition: inline; filename=\"mypic.jpg\"\nContent-length: ".(string)(filesize($filename)) ); 
fpassthru($fp); 
?>
Tip: Je kunt een directorie ook niet publiekelijk maken m.b.v. een .htaccess bestand.

[ Voor 12% gewijzigd door Slagroom op 30-06-2003 16:44 ]


Acties:
  • 0 Henk 'm!

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 10-09 11:45
muis schreef op 30 June 2003 @ 16:40:
Je kan bij de foto het bijbehorende album halen uit de database om vervolgens te kijken of de gebruiker er rechten tot heeft?
Dat lijkt me (afhankelijk van je DB design) een quesie van 1 query
Maar dan moet er ook nog gecontroleerd worden of een foto in een public album voorkomt. Misschien kan dat ook wel in 1 query, maar 1 query per image is al gauw 50+ queries per album... Misschien is het de enig oplossing...

Acties:
  • 0 Henk 'm!

  • samo
  • Registratie: Juni 2003
  • Laatst online: 15:39

samo

yo/wassup

[Ik heb geen idee van de PHP code, misschien kan iemand anders dat toelichten, maar wel een idee van eventuele mogelijkheden]
Kan je niet uit de HTTP HEADER uitlezen van welke pagina de user komt, en aan de hand daarvan registreren of dit rechtmatig is of niet?

Bekend van cmns.nl | ArneCoomans.nl | Het kindertehuis van mijn pa in Ghana


Acties:
  • 0 Henk 'm!

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 10-09 11:45
Nee, want een gebruiker kan wel zijn ingelogd, maar geen rechten hebben op de foto.
En daar komt nog bij.. Je moet wel weten welke rechten een user heeft op de foto. Anders kun je hem ook niks wijgeren. De vraag is dus. Hoe kom je achter deze rechten.

[ Voor 51% gewijzigd door kaandorp op 30-06-2003 16:58 ]


Acties:
  • 0 Henk 'm!

  • muis
  • Registratie: Oktober 2001
  • Laatst online: 18-11-2022
kaandorp schreef op 30 June 2003 @ 16:50:
[...]

Maar dan moet er ook nog gecontroleerd worden of een foto in een public album voorkomt. Misschien kan dat ook wel in 1 query, maar 1 query per image is al gauw 50+ queries per album... Misschien is het de enig oplossing...
Iemand vraagt toch maar 1 plaatje per keer op?
denk dat je op "album-niveau" moet controleren. Als iemand geen toegang heeft tot 1 plaatje van een album dan heeft ie ook geen toegang tot de rest van de plaatjes van dat album (toch?)

Een vergissing is menselijk maar om er een puinhoop van te maken heb je een computer nodig (met mij erachter)


Acties:
  • 0 Henk 'm!

Verwijderd

Waarom laat je het plaatje niet versturen dmv een php script. Dan kan je in het script altijd nog aangeven of iemand toegang heeft of niet. De functie readfile() van php is je vriend, vergeet niet de juiste headers er boven te zetten.

Acties:
  • 0 Henk 'm!

Verwijderd

Hoe weet je in welke albums een plaatje voorkomt?

Als voor elk album waar de gebruiker voor geautoriseerd is, de bijbehorende plaatjes worden opgehaald, dan lijkt me dat geen probleem.

Heb je geen overzichtje van je DB-structuur?

Acties:
  • 0 Henk 'm!

  • exyll
  • Registratie: Januari 2002
  • Laatst online: 14-04 14:45
Je authorisatie controle doe je per image. Image stuur je naar de client via een passthrough zoals hier is beschreven. Maar je authorisatie set haal je gewoon maar één maal op en zet je in de sessie. Op die manier weinig DB I/O.

Je kunt de grap ook doen via een session cookie waarin. Op mijn website voorkom ik daardoor het crosslinken van bestanden. Je moet eerst op m'n site zijn geweest voor je images kunt zien.

Ramon Smits


Acties:
  • 0 Henk 'm!

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 10-09 11:45
Exyll schreef op 01 July 2003 @ 08:58:
Je authorisatie controle doe je per image. Image stuur je naar de client via een passthrough zoals hier is beschreven. Maar je authorisatie set haal je gewoon maar één maal op en zet je in de sessie. Op die manier weinig DB I/O.

Je kunt de grap ook doen via een session cookie waarin. Op mijn website voorkom ik daardoor het crosslinken van bestanden. Je moet eerst op m'n site zijn geweest voor je images kunt zien.
Zit er een limiet aan wat ik in die sessie kan stoppen? Het kan natuurlijk voorkomen dat er een array inkomt met ongeveer 500 ID's van foto's

Acties:
  • 0 Henk 'm!

  • exyll
  • Registratie: Januari 2002
  • Laatst online: 14-04 14:45
kaandorp schreef op 01 July 2003 @ 10:06:
[...]

Zit er een limiet aan wat ik in die sessie kan stoppen? Het kan natuurlijk voorkomen dat er een array inkomt met ongeveer 500 ID's van foto's
Limiet is volgens mij je systeem resources... Afhankelijk van het aantal bezoekers kun je dit wel of juist niet doen.

Maar waarom alle foto id's? Kun je de foto's niet bundelen tot groepen/mapjes/albums? Je gebruikt nu ook al albums. En zo kun je dan nog verder hiërarchisch werkt (groepen in groepen). Als je dat ook met gebruikers doet kun je je session grootte flink beperken.

Maar 500 foto's is echt niet veel data als je het hebt over dat gebruiker X voor foto Y is geautoriseerd. Dat zijn hoogstwaarschijnlijk 8 bytes (2x foreignkey) plus een kleine overhead voor je sorted array, hashtable of weet ik wat je gebruikt. Nemen we als voorbeeld 16 bytes per record dan komen we uit op op geen 8kb. Het word pas een probleem als je duizenden concurrent sessions hebt. Nemen we even aan dat je authorisatie op album niveau doet dan heb je 10 albums dan hebben we het over 160B per sessie.....

Ik zit alleen niet goeg genoeg in php om te weten wat voor nadelen er zijn aan het gebruik van sessies.

[ Voor 9% gewijzigd door exyll op 01-07-2003 11:15 ]

Ramon Smits


Acties:
  • 0 Henk 'm!

Verwijderd

Misschien een beetje simpele/twijfelachtige oplossing, maar kan weinig kwaad denk ik: alle plaatjes opslaan met de naam album-id_afbeelding-id dus bijv. 10_451.gif
In het script kan dan zo de profiel id gepakt worden uit de naam. Dat is niet te omzeilen via url van als je ?p=8_451 opvraagt dan bestaat het bestand niet (controleren natuurlijk)

[ Voor 3% gewijzigd door Verwijderd op 01-07-2003 12:46 ]


Acties:
  • 0 Henk 'm!

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 10-09 11:45
Kan, maar dan is het niet echt dynamisch meer. Ik gebruik bijvoorbeeld ook foto's in meerdere albums.

Acties:
  • 0 Henk 'm!

Verwijderd

Ok dan houd het inderdaad snel op.

Waarom dan niet gewoon de standaard oplossing, 1 query per afbeelding? Die tabel is waarschijnlijk een die bestaat uit een paar kolommen met getallen en met index moet dat toch redelijk snel kunnen gaan.
Ook maakt het doel nog wel heel wat uit natuurlijk. Is het een fotoboek voor jezelf/een clubje of moet half nederland kijken. Het zal echt niet zo snel een probleem worden, probeer het gewoon eens. Waarschijnlijk kan je inclusief query nog tientallen per seconden eruit krijgen, en dat moet toch wel genoeg zijn.

Acties:
  • 0 Henk 'm!

Verwijderd

je kan op 2 manieren zorgen dat je plaatjes alleen maar gezien mogen worden door de personen die jij daar toegang tot geeft.

1. Inloggen en in de image.php controlleren of de sessie goed staat

2. kijken naar de referer en wanneer deze bv inderdaad van het album is waar het plaatje toe behoort deze laten zien
Pagina: 1