sichere Session ID generieren
Cruz
- perl
0 Andreas0 Rol0 Cruz
0 Korbinian Bachl0 Michael Schröpl0 Cruz0 Cruz0 Klaus Mock0 Cruz
0 Andreas0 Michael Schröpl
Hi Leute,
ich brauche zuverlässige Session IDs für eine gut besuchte Plattform und habe entdeckt, dass ich mit time und einer Zufallszahl nicht sehr weit komme. Ich möchte kein Modul dafür verwenden, aber ich weiß noch nicht so recht wie ich ansetzen soll. Wie macht ihr das denn so?
Ciao,
Cruz
Moin!
Naja, in PHP gibt es den unix timestamp in microsekunden, dazu noch ne zufallszahl, oder eine md5-codierte IP, vielleicht noch andere Client-Informationen, das kannst Du ja nach belieben kombinieren, ich denke das sollte nicht so schwer sein :-)
Grüße
Andreas
Hi,
ich mache es so:
---------------------------------------------------------------------
my $sid;
srand(time);
my @letters = qw(a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9);
my $i;
my $length = '24';
for($i=0;$i<$length;$i++)
{
my $random_letter = $letters[int(rand($#letters))];
$sid .= $random_letter;
}
Die Länge und die zu verwendenden Zeichen der sid kanst du ja nach belieben variieren.
Viele Grüße
Rol
Hi Rol,
Ich danke dir für den Code, das war ein echt konstruktiver Beitrag. :)
Nur Leider hat dein Code genau das selbe Problem, wie meins.
Durch das srand(time) kriegst du für eine volle Sekunde die selbe Zufallszahl. Wenn du diesen Code in einer Subroutine packst, und es 100000 mal hintereinander eine Session ID generieren lässt, dann siehst du, dass der Code in 2000-er Blöcken die selbe Session ID ausgibt.
Ich suche einen Ansatz oder ein Stück Code, das den oben genannten Test besteht.
Ciao,
Cruz
Hi,
ich mache es so:
my $sid;
srand(time);
my @letters = qw(a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9);
my $i;
my $length = '24';
for($i=0;$i<$length;$i++)
{
my $random_letter = $letters[int(rand($#letters))];
$sid .= $random_letter;
}
Die Länge und die zu verwendenden Zeichen der sid kanst du ja nach belieben variieren.
Viele Grüße
Rol
Hi,
warum nicht mal auf php.net gucken ??? dort nach md5 suhen und schon der erste userkommentar sagt aus:
------------------
U can generate unique string with this way :
srand((double)microtime()*1000000);
$unique_str = md5(rand(0,9999999));
print $unique_str;
It is good for password, cookies or Session_ID (if u're using PHP3) ...
LexZEUS
--------------------
aber warum soll man auch in handbüchern oder dokus blättern wann man im forum fragen kann.....
sorry, aber erst kucken und dann frage
mfg
Korbinian Bachl
www.whiskyworld.de
PS: unter google.de "php session erzeugen" eingeben bringt das gleiche ergebniss auf mehreren hundert seiten...
Erstens weil ich nach Perl Code suche und nicht nach PHP. Und zweitens weil ich schon ausreichend gesucht habe und ich nur Hinweise auf Module gefunden habe, aber ich möchte unbedingt eigenen Code haben.
Erst lesen, dann denken, dann Motzen.
Gruß
Cruz
Hi,
warum nicht mal auf php.net gucken ??? dort nach md5 suhen und schon der erste userkommentar sagt aus:
U can generate unique string with this way :
srand((double)microtime()*1000000);
$unique_str = md5(rand(0,9999999));
print $unique_str;
It is good for password, cookies or Session_ID (if u're using PHP3) ...
LexZEUS
aber warum soll man auch in handbüchern oder dokus blättern wann man im forum fragen kann.....
sorry, aber erst kucken und dann frage
mfg
Korbinian Bachl
www.whiskyworld.de
PS: unter google.de "php session erzeugen" eingeben bringt das gleiche ergebniss auf mehreren hundert seiten...
Hi!
scheint mit PERL nicht ganz so einfach, was :-) Aber das prinzip ist das riochtige, das einzige was Du noch brauchst sind micro-Sekunden, anscheinend kann das PERL nicht, vielleicht hilft Dir das:
http://www.perldoc.com/perl5.6.1/pod/perlfaq8.html#How-can-I-measure-time-under-a-second-
oder auch http://perldoc.com/cgi-bin/htsearch?words=time()&restrict=perl5.6.1
Grüße
Andreas
Hi Cruz,
ich brauche zuverlässige Session IDs für eine gut besuchte Plattform
was stellst Du Dir denn unter einer "zuverlässigen" Session-ID vor?
Eine ID ist erst mal nur eine Zahl. Die kann nicht "zuverlässig" sein
und habe entdeckt, dass ich mit time und einer Zufallszahl nicht
sehr weit komme.
Auf dem Weg wohin?
Ich möchte kein Modul dafür verwenden, aber ich weiß noch nicht so
recht wie ich ansetzen soll. Wie macht ihr das denn so?
Mit einer Aufgabenstellung.
Welche Anforderungen hast Du an eine Session-ID?
Wenn sie beispielsweise eindeutig sein soll und sonst nichts, dann
würde ich behaupten, daß innerhalb einer Session (Achtung, zufällige
Namensgleichheit) Deines Betriebssystems Prozeß-IDs unique sein sollten,
also das Paar aus Prozeß-ID und timestamp insgesamt unique ist (weil
Deine Betriebssystem-Session länger dauert als die Auflösungsgrenze
des time stamp).
Aber ich kann mir durchaus eine Menge weiterer Eigenschaften einer
Session-ID vorstellen, die über "unique" weit hinausreichen würden.
Viele Grüße
Michael
Hallo Michael,
Ja unique sollte sie natürlich sein. Mit zuverlässig meinte ich eigentlich, dass die Gefahr nicht besteht, dass zwei mal hintereinander die selbe Session ID generiert wird.
Außer der Zuverlässigkeit und dass die Session ID numerisch oder ein String ist, was gibt es denn da noch für Eigenschaften, die wichtig sein können?
Ich habe vor zu FastCGI zu wechseln, und da die Scripte ja dann länger laufen, befürchte ich, dass timestamp und PID keine eindeutige Session IDs ergeben, wenn mehrere in einer Sekunde generiert werden. Was meinst du?
Ciao
Cruz
Hi Cruz,
ich brauche zuverlässige Session IDs für eine gut besuchte Plattform
was stellst Du Dir denn unter einer "zuverlässigen" Session-ID vor?
Eine ID ist erst mal nur eine Zahl. Die kann nicht "zuverlässig" sein
- höchstens das Verfahren zu ihrer Bestimmung ...
und habe entdeckt, dass ich mit time und einer Zufallszahl nicht
sehr weit komme.
Auf dem Weg wohin?
Ich möchte kein Modul dafür verwenden, aber ich weiß noch nicht so
recht wie ich ansetzen soll. Wie macht ihr das denn so?
Mit einer Aufgabenstellung.
Welche Anforderungen hast Du an eine Session-ID?
Wenn sie beispielsweise eindeutig sein soll und sonst nichts, dann
würde ich behaupten, daß innerhalb einer Session (Achtung, zufällige
Namensgleichheit) Deines Betriebssystems Prozeß-IDs unique sein sollten,
also das Paar aus Prozeß-ID und timestamp insgesamt unique ist (weil
Deine Betriebssystem-Session länger dauert als die Auflösungsgrenze
des time stamp).
Aber ich kann mir durchaus eine Menge weiterer Eigenschaften einer
Session-ID vorstellen, die über "unique" weit hinausreichen würden.
Viele Grüße
Michael
Hallo nochmal Michael,
ich habe es inzwischen geschafft mein Ziel eindeutig zu artikulieren. ;)
Ich möchte ein Subroutine haben, die ich von einem Script aus 100000 mal hintereinander ausführen kann und dabei trotzdem eindeutige Session IDs generiert werden. srand(time) und time liefern in der selben Sekunde immer die selben Werte.
Ciao,
Cruz
Hallo,
srand(time) und time liefern in der selben Sekunde immer die selben Werte.
Du verwendest die falsche Funktion, nimm rand().
Näheres dazu:
http://www.perldoc.com/perl5.6.1/pod/func/rand.html
http://www.perldoc.com/perl5.6.1/pod/func/srand.html
Grüße
Klaus
Ja das war es! Danke!
Cruz
Hallo,
srand(time) und time liefern in der selben Sekunde immer die selben Werte.
Du verwendest die falsche Funktion, nimm rand().
Näheres dazu:
http://www.perldoc.com/perl5.6.1/pod/func/rand.html
http://www.perldoc.com/perl5.6.1/pod/func/srand.html
Grüße
Klaus
Hi!
Ich möchte ein Subroutine haben, die ich von einem Script aus 100000 mal hintereinander ausführen kann und dabei trotzdem eindeutige Session IDs generiert werden. srand(time) und time liefern in der selben Sekunde immer die selben Werte.
mit microtime sind es eine Mio Werte pro Sekunde, und wenn das in PHP geht geht das wohl auch in PERL, oder?
Grüße
Andreas
Hi Cruz,
ich habe es inzwischen geschafft mein Ziel eindeutig zu artikulieren. ;)
Ich möchte ein Subroutine haben, die ich von einem Script aus 100000 mal
hintereinander ausführen kann und dabei trotzdem eindeutige Session IDs
generiert werden. srand(time) und time liefern in der selben Sekunde
immer die selben Werte.
darf ich "von einem Script" so verstehen, daß dieses Skript ein Gedächtnis
besitzt, welches von einem Session-ID-Aufruf zum nächsten Bestand hat?
Wenn ja, dann kannst Du einfach einen autoincrement-Zähler ($i++) dazu
nehmen. Das Tripel aus $PID, timestamp und Zähler ist sicherlich unique.
Mit sprintf formatiert in einen schönen langen String bekommst Du eine
ca. 20-25 Ziffern lange Zahl, die Du als Session-ID verwenden kannst.
Viele Grüße
Michael