Schrift
[thread]250[/thread]

Performance beim Parsen von Bildern



<< >> 10 Einträge, 1 Seite
bony
 2004-05-04 03:29
#2344 #2344
User since
2004-04-30
18 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo,

auf meiner privaten Homepage habe ich ein passwortgeschütztes Fotoalbum. Die User sind in unterschiedliche Gruppen eingeteilt und haben unterschiedliche Zugriffsrechte auf die verschiedenen Alben. Nun sollen die Bilder besser vor unberechtigtem Zugriff geschützt werden. Dazu werden die Bilder per CGI-Skript aus einem Verzeichnis geholt, das nicht im Webpfad liegt. Dazu wird ein Cookie mit der Session-ID gelesen. Zum Session-Handling benutze ich bisher Apache::Session::MySQL. Um auf die Daten aus der Session zugreifen zu können, wird zunächst das Session-Objekt instanziert:
Code: (dl )
1
2
3
4
tie %session, 'Apache::Session::MySQL', $sid, {
Handle => $dbh,
LockHandle => $dbh,
};

Dann wird kontrolliert, ob das Account überhaupt aktiviert ist, ob die Gruppe, in der der User ist, überhaupt Berechtigung hat, auf dieses Album zuzugreifen und wenn das alles passt, wird der Pfad zu den Bildern aus der DB gelesen und das entsprechende Bild eingeblendet.
Nun befinden sich auf einer Albumseite maximal 12 Thumbnails. Das Programm muss natürlich für jedes einzelne Thumbnail aufgerufen werden. Nun schwant mir, dass das ganz schön zu Lasten der Performance geht. Insbesondere das Binden der Session scheint mit nicht sehr performant.

Würde die Rechenlast geringer, wenn ich hier nicht Apache::Session::MySQL nutze und die nötigen Daten per "eigener" Datenbankabfrage hole?

Der Text der Session hat ja ein wenig ein komisches Format. Sieht ungefähr folgendermaßen aus:
Code: (dl )
1
2
3
...
ChristophsidLogin esidHtml 1sidUsrId 1sidGrpId e sidStatus ChristophsidFname
...

Leider steige ich nicht ganz dahinter, welche Trennzeichen für Bezeichner und Wert verwendet werden, um den Text mit regulären Ausdrücken aufzudröseln (unter Windows erscheinen immer nur so kleine Kästchen). Weiß da vielleicht jemand bescheid?

Gibt es bessere Wege, die Bilder vor unberechtigtem Zugriff zu schützen?

Gruß
Christoph
esskar
 2004-05-04 04:11
#2345 #2345
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
anscheinend lässt du für jedes thumbnail ein perl-script laufen, wobei das script dann wie "Content-Type: image/*" das Bild an den Browser jubelt!

Lässt du die Thumbnails Seite von einem Script generieren?
Wenn ja, dann denk dir doch in diesem Script einen Stempel aus (also eine id, welcher du einem Timestamp "anklebst")
Diesen Stempel übergibst du zusätzlich zur sid an dein ThumbNail script!

Wenn der stempel nun älter als 30 Sekunden oder ähnlich ist, hast du zwei möglichkeiten:
1. du gibst einen fehler aus
2. du rechnest die rechte nochmals über die sid aus, und gibst bei nicht okay, einen fehler aus

ansonsten gibst du das bild aus!
Taulmarill
 2004-05-04 11:33
#2346 #2346
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
also, der rechenlastunterschied zwischen Apache::Session und einer eigenen Routine halte ich für vernachlässigbar.
Der "Text der Sesstion" sieht tatsächlich etwas eigentümlich aus. den müsstest du aber doch auch selbst ins hash geschrieben haben, oder?
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
bony
 2004-05-04 12:57
#2347 #2347
User since
2004-04-30
18 Artikel
BenutzerIn
[Homepage] [default_avatar]
Den "Session-Text" habe ich nicht selbst geschrieben. Das macht ja Apache::Session so schön einfach für einen ;-).

Das sieht ja z.B. so aus:
Zuerst die Session binden:
Code: (dl )
1
2
3
4
5
6
tie my %session, 'Apache::Session::MySQL', $sessionId, {
      Handle     => $dbh,
      LockHandle => $dbh,
};

$sh = \%session;


Dann kann man die Session mit diversen Informationen "laden":
Code: (dl )
1
2
3
4
5
6
$sh->{ 'sidUsrId' } = $userId;
$sh->{ 'sidLogin' } = $login;
$sh->{ 'sidGrpId' } = $groupId;
$sh->{ 'sidHtml' } = $html;
$sh->{ 'sidNewsL' } = $newsletter;
$sh->{ 'sidStatus' } = $status;
, bzw. ebenso einfach auf diese Daten zugreifen.

Die Session wird von Apache::Session::MySQL in eine Datenbanktabelle Namens "sessions" geschrieben, die eigentlich nur 2 Felder beinhaltet. Ein Feld mit der Session-Id und eines mit allen Bezeichner-Wert-Paaren, die in die Session "geladen" wurden.

Ich bin leider ganz und gar kein Perl- und SQL-Profi ;-). Deshalb weiß ich auch nicht genau, wie Rechenaufwändig solche Datenbankabfragen sind. Irgendwie hatte ich immer das Gefühl, dass mit dem Binden der Session und Zugriff auf die Variablen mehr passiert, als dass diese nur gelesen wird. So gibt es auch keinen extra Befehl, der die Session in die DB schreibt. Also muss doch eigentlich bei jedem Zugriff auf das Session-Objekt, bzw. auf so eine "Session-Variable" die Session komplett neu in die Datenbank geschrieben werden (?). Leider bin ich mit meinem schmalen Perl-Wissen noch nicht so ganz hinter die Funktion des Moduls Apache::Session gestiegen.

Die Sache mit dem Timestamp ist eine gute Idee, die ich mir merken werde, ob ich sie nun hier benutze oder nicht.
Was ist denn eine empfehlenswerte Art, so einen Stempel, der ja dann mindestens die User-ID enthalten sollte, zu gestalten. Die User-ID sollte ja dann schon halbwegs versteckt sein.
renee
 2004-05-04 13:29
#2348 #2348
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du musst keine Methode zum Speichern der Session explizit aufrufen, weil es ge"tie"ed wurde...

Das heißt in dem Modul wird erkannt, ob die Session geändert wurde oder was auch immer und dann wird darauf "reagiert"...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
esskar
 2004-05-04 14:13
#2349 #2349
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=renee,04.05.2004, 11:29]Das heißt in dem Modul wird erkannt, ob die Session geändert wurde oder was auch immer und dann wird darauf "reagiert"...[/quote]
das in die datenbank schreiben passiert wohl gdw. wenn der Tie entbunden wird, also wenn das Script terminiert!
renee
 2004-05-04 14:31
#2350 #2350
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ja, sonst müsste vielleicht 20 mal im Skriptdurchlauf was gespeichert werden, aber es gibt vielleicht noch andere Sachen, die gemacht werden...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Taulmarill
 2004-05-04 16:49
#2351 #2351
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
man kann Apache::Session ohne probleme verwenden.
der rechenaufwand auch bei älteren rechnern sollte vernachlässigbar sein, vor allen dingen wenn man nur ne hand voll parameter setzt.
ich kann nur davon abraten mit Apache::Session Sessions zu initialisieren und die dann selbst direkt zu benutzen. dann sollte man lieber selbst was komplettes implementieren oder das modul so modifizieren wie mann&´s braucht.

btw. ich benutze Apache::Session mit gut 1,5 kB nutzdaten und habe bisher noch keine probleme gehabt
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
bony
 2004-05-04 18:36
#2352 #2352
User since
2004-04-30
18 Artikel
BenutzerIn
[Homepage] [default_avatar]
O.k., danke, dann werde ich das Modul bedenkenlos weiter nutzen.
Ich habe beim Testen auf meinem Rechner bemerkt, dass dieses Skript recht deutlich zu Lasten der Performance geht. Ich kann aber mit leben. Wenn es meinem Provider nicht passt, wird er sich schon melden ;-).
pktm
 2004-05-04 19:09
#2353 #2353
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Ich suche noch so ein Script, kannst du mir das mal zukommen lassen (per PM oder so)?
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
<< >> 10 Einträge, 1 Seite



View all threads created 2004-05-04 03:29.