Siechfred: Generieren einer SessionID

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

--
»Sie kochten heimlich mit Wasser und tranken öffentlich Wein.«
  1. 你好 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

    --
    Das Leben ist wie ein Kartenspiel: was dir gegeben wurde, ist vorbestimmt. Doch wie du damit spielst, ist deine Entscheidung.
    http://wwwtech.de/
    1. 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

      --
      »Sie kochten heimlich mit Wasser und tranken öffentlich Wein.«
      1. 你好 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

        --
        So, wie ein Teil ist, ist das Ganze.
        http://wwwtech.de/
        1. 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

          --
          »Sie kochten heimlich mit Wasser und tranken öffentlich Wein.«