Thread Session-Nutzung möglich? (21 answers)
Opened by panni at 2012-02-27 12:39

rosti
 2012-03-14 19:18
#156850 #156850
User since
2011-03-19
3206 Artikel
BenutzerIn
[Homepage]
user image
CGI::Session empfehle ich nicht, es macht die Sache unnötig kompliziert und ist umständlich zu handhaben. Beim Aufbau eines Login-Systems ist es einfacher, auf eine bestehende Session (Session-ID, SID) zuzugreifen, als eine Session erst dann zu erzeugen, wenn ein erfolgreicher Login vorliegt. Erst bei Letzterem wird serverseitig gespeichert mit der eindeutigen SID als Schlüssel.

Das Aushandeln der SID jedoch, kann unabhängig vom Login erfolgen, wie das geht, habe ich weiter oben beschrieben und zum Verständnis poste ich mal das kleine Script, was ich ebenfalls weiter oben mal verlinkt habe.

Code (perl): (dl )
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
47
48
49
50
51
52
53
54
55
56
#!/usr/bin/perl

use strict;
use warnings;
use CGI;
use CGI::Cookie;
use Digest::MD5 qw(md5_hex);

# ein paar Variablen
my $cookiename = 'SCHERZKEKS';
my %cookies    = fetch CGI::Cookie;
my $sid        = undef;
my $nocookie   = undef;

# nehme die SID aus dem gesendeten Cookie
if(defined $cookies{$cookiename}){
        $sid = $cookies{$cookiename}->value;
        # hier sollte noch geprüft werden, ob die SID
        # den Anforderungen genügt
}
else{
        # erzeuge eine neue SID
        $sid = _makeSID();
        $nocookie = "Kein Cookie vom UA bekommen\n";
}


# Response
if(defined $nocookie){
        my $cookie = new CGI::Cookie(
                -name  => $cookiename,
                -value => $sid,
                -path  => '/',
        );
        print "Set-Cookie: $cookie\n" ;
}
print "Content-Type: text/plain\n\n";
print "SID: $sid\n";
print $nocookie if $nocookie;

exit;
###########################################################################
# SessionID erzeugen
sub _makeSID{
        my @chars = ('A' .. 'Z', 'a' .. 'z', 0 .. 9, '+', '-');
        my $len = scalar @chars;

        my $id .= time();
        $id .= $$;
        for(my $i = 0; $i < $len; $i++){
                $id .= $chars[int(rand($len))];
        }
        $id = substr($id, 0, $len);
        $id = md5_hex($id);
        return $id;
}


Zu sehen ist, dass der Cookie-Header nur dann gesendet wird, wenn der Merker $nocookie gesetzt wurde. Selbst auf diese Kontrolle kannst Du verzichten, indem Du den Cookie-Header einfach immer sendest.

Auf diese Art und Weise lässt sich eine Session viel einfacher integrieren, als mit CGI::Session, es steht eine $sid zur Verfügung, damit wird ein erfolgreicher Login gespeichert und bei nachfolgenden Requests anhand der Login-Tabelle geprüft, ob der Requester autorisiert ist.

Login ist: Authentifizierung
Login-Tabelle: Hier drin ist die Autorisierung hinterlegt, z.B. die Gruppenzugehörigkeit.

Authentifizierung und Autorisierung sind zwei verschiedene Dinge.

Session-Expires: Ein Session-Cookie hat keinen solchen Parameter. Der Browser löscht den Cookie beim Beenden der Sitzung, fertig.

Login-Expires: Kann festgelegt werden, ist in der Login-Tabelle hinterlegt und sollte auch festgelegt sein für den Cleanup-Prozess.

Das sind die Sachen, auf die es ankommt.

Viel Erfolg!
Rosti

View full thread Session-Nutzung möglich?