Generieren einer SessionID
Siechfred
- perl
Tag.
Wahrscheinlich sehe ich gerade den Wald vor lauter Bäumen nicht :)
Ich bin gerade dabei, mir ein eigenes Session-Objekt zu basteln, da mir die sehr nützlichen CGI::Session-Module leider nicht zur Verfügung stehen und ich auch keine Möglichkeit habe, diese zu installieren. Meine SessionID sieht im Moment so aus:
my $SID = "$$"."$<";
Dazu meine Fragen:
Kann ich davon ausgehen, dass dieser String immer eine konstante Länge hat? Sollte ich die ID noch verschlüsseln (MD5, base64 o.ä.) oder würde es ausreichen, den String lediglich mit pack zu behandeln? Gibt es vielleicht sogar eine bessere bzw. elegantere Variante, eine ID zu erzeugen?
Siechfred
你好 Siechfred,
Ich bin gerade dabei, mir ein eigenes Session-Objekt zu basteln, da mir
die sehr nützlichen CGI::Session-Module leider nicht zur Verfügung
stehen und ich auch keine Möglichkeit habe, diese zu installieren.
Natuerlich kannst du die installieren. Die sind reines Perl, es reicht,
die in das richtige Verzeichnis zu packen. Eventuell noch ein 'use lib'
und dann sollte das gehen.
Meine SessionID sieht im Moment so aus:
my $SID = "$$"."$<";
Dazu meine Fragen:
Kann ich davon ausgehen, dass dieser String immer eine konstante
Länge hat?
Nein. $< ist 32 Bit lang, schwankt also zwischen einem Zeichen und 10
Zeichen (2^32).
Sollte ich die ID noch verschlüsseln (MD5, base64 o.ä.) oder würde
es ausreichen, den String lediglich mit pack zu behandeln?
Es reicht vollstaendig, ihn mit pack() zu behandeln. Allerdings wuerde ich
noch das Zufallselement mit hineinbringen, sonst sind deine Session-Files
vorhersagbar.
Gibt es vielleicht sogar eine bessere bzw. elegantere Variante, eine
ID zu erzeugen?
Ich mache das immer so:
sub generate_unid {
my $length = shift;
my $rmid = $ENV{HTTP_X_FORWARDED_FOR} || $ENV{REMOTE_ADDR} || '654.546.654.546';
my @chars = split // => 'aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ0123456789-_';
my $id = '';
$rmid =~ tr!.!0!;
$id .= $chars[$_] foreach split // => $rmid;
$id .= $chars[rand @chars] for 1..$length;
return $id;
}
再见,
CK
Tag Christian.
Natuerlich kannst du die installieren. Die sind reines Perl, es reicht,
die in das richtige Verzeichnis zu packen. Eventuell noch ein 'use lib'
und dann sollte das gehen.
Naja, dass es reines Perl ist, habe ich schon gesehen. Allerdings handelt es sich AFAIK um eine ganze Reihe von Modulen, CGI::Session, CGI::Session::Id::MD5, CGI::Session::MySQL usw., das macht die Sache etwas aufwändiger, und da ich eh nicht alle Funktionen brauche, dachte ich mir, dass das Programmieren eines eigenen Session-Packages schneller geht :)
Nein. $< ist 32 Bit lang, schwankt also zwischen einem Zeichen und 10
Zeichen (2^32).
Okay.
Es reicht vollstaendig, ihn mit pack() zu behandeln. Allerdings wuerde ich
noch das Zufallselement mit hineinbringen, sonst sind deine Session-Files
vorhersagbar.
Jo, danke für den Hinweis.
Ich mache das immer so:
sub generate_unid [...]
Fein, darf ich mir die sub "klauen"?
Siechfred
你好 Siechfred,
Nein. $< ist 32 Bit lang, schwankt also zwischen einem Zeichen und 10
Zeichen (2^32).Okay.
Vergessen zu erwaehnen: dasselbe gilt fuer $$.
Ich mache das immer so:
sub generate_unid [...]Fein, darf ich mir die sub "klauen"?
Selbstverstaendlich, ist doch OpenSource (direkt aus dem Classic Forum
entnommen).
再见,
CK
Tag Christian.
Fein, darf ich mir die sub "klauen"?
Selbstverstaendlich, ist doch OpenSource (direkt aus dem Classic Forum
entnommen).
Ich habe es etwas abgewandelt:
sub _create_SID {
my $rmid = $ENV{HTTP_X_FORWARDED_FOR} || $ENV{REMOTE_ADDR} || '654.546.654.546';
$rmid =~ tr/./0/;
$rmid = pack("a[12]",$rmid);
my @chars = split // => 'aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ0123456789-_';
my $id = '';
$id .= $chars[$_] foreach split // => $rmid;
$id .= $chars[rand @chars] for 1..4;
return $id;
}
Das liefert mir eine 16-stellige SessionID. Dann kann ich ja weiterbasteln :)
Siechfred