Tommy: Sicherheit und Überprüfen von $_SESSION Variablen

Hi, es geht mir um die Sicherheit und Schnelligkeit von Session Variablen.

Ich setze die Session

$_SESSION['username'] =‘Walter‘;

  1. Auf der nächsten Seite brauche ich diese 10 Mal. Kann ich sie einfach 10 x mit $_SESSION['username'] verwenden?
  2. Muss ich am Anfang der Seite überprüfen ob sie vorhanden ist
  3. Wird sie beim Benutzen jedes Mal überprüft oder nur das erst mal wenn sie auf der Seite benutzt wird?

Tommy

  1. Hallo Tommy,

    einige deiner Fragen könntest du durch Nachlesen oder sogar Ausprobieren leicht selbst beantworten. Aber sei's drum ...

    es geht mir um die Sicherheit und Schnelligkeit von Session Variablen.

    Was verstehst du in diesem Zusammenhang unter Sicherheit?

    Ich setze die Session

    $_SESSION['username'] =‘Walter‘;

    1. Auf der nächsten Seite brauche ich diese 10 Mal. Kann ich sie einfach 10 x mit $_SESSION['username'] verwenden?

    Natürlich. Wie sonst?

    1. Muss ich am Anfang der Seite überprüfen ob sie vorhanden ist

    Auf jeden Fall. Andernfalls wirft ein Zugriff eine Notice. Außerdem willst du ja sicher im Fehlerfall eine kontrollierte, definierte Reaktion haben.

    1. Wird sie beim Benutzen jedes Mal überprüft oder nur das erst mal wenn sie auf der Seite benutzt wird?

    Soweit ich weiß, wird eine Variable, auch ein Eintrag in einem Array, beim ersten Zugriff darauf implizit erzeugt. Das ist aber eigentlich unerheblich, denn wie schon erwähnt, möchte man den Fehlerfall ja sowieso sauber abfangen und dann vermutlich ganz anders im Programm verzweigen.

    Live long and pros healthy,
     Martin

    --
    Früher war ich klein und dumm. Inzwischen hat sich so manches geändert. Ich bin größer geworden.
    1. Tach!

      1. Auf der nächsten Seite brauche ich diese 10 Mal. Kann ich sie einfach 10 x mit $_SESSION['username'] verwenden?

      Natürlich. Wie sonst?

      Mit Umkopieren in eine andere Variable. Aber falls das einen messbaren Geschwindigkeitsvorteil bring, dann ist der viel zu gering, um aufzufallen. Besser lässt man den Code lesbar und müllt ihn nicht mit Optimierungen zu, die nichts bringen.

      1. Wird sie beim Benutzen jedes Mal überprüft oder nur das erst mal wenn sie auf der Seite benutzt wird?

      Das kommt auch darauf an, was für den konkreten Anwendungsfall sinnvoll ist.

      Soweit ich weiß, wird eine Variable, auch ein Eintrag in einem Array, beim ersten Zugriff darauf implizit erzeugt.

      Nicht bei jeglichen Zugriffen. Lesezugriffe machen gar nichts (außer die Notice zu werfen). Nur Schreibzugriffe legen Variablen an, inklusive Array-Felder und Objekteigenschaften.

      dedlfix.

      1. Hallo,

        1. Auf der nächsten Seite brauche ich diese 10 Mal. Kann ich sie einfach 10 x mit $_SESSION['username'] verwenden?

        Natürlich. Wie sonst?

        Mit Umkopieren in eine andere Variable.

        das habe ich bewusst verdrängt, wollte es gar nicht erst als Option ins Spiel bringen.

        Soweit ich weiß, wird eine Variable, auch ein Eintrag in einem Array, beim ersten Zugriff darauf implizit erzeugt.

        Nicht bei jeglichen Zugriffen. Lesezugriffe machen gar nichts (außer die Notice zu werfen).

        Ich glaube, da bin ich schon einmal drauf reingefallen.

        Nur Schreibzugriffe legen Variablen an, inklusive Array-Felder und Objekteigenschaften.

        Mir war, als hätte das auch beim Lesen passieren sollen. Wart's nur ab, wenn in drei Monaten wieder jemand danach fragt, erkläre ich's bestimmt wieder falsch!

        Live long and pros healthy,
         Martin

        --
        Früher war ich klein und dumm. Inzwischen hat sich so manches geändert. Ich bin größer geworden.
        1. $_SESSION['username'] verwenden?

          Mit Umkopieren in eine andere Variable.

          das habe ich bewusst verdrängt, wollte es gar nicht erst als Option ins Spiel bringen.

          Und daran hast Du gut getan! Das Umkopieren verschleiert in den Fällen von allen „vom System“ gesetzten Variablen die Herkunft. Das hat sich nach meiner Erfahrung außer im Hinblick auf die reine Tipparbeit noch nie positiv bemerkbar gemacht.

          • Abgesehen von den Geschäftsberichten der einschlägigen Hersteller von Kopfschmerztabletten natürlich…

          Verschwörungstheorie: Vielleicht stecken die ja hinter den vielen Beispielen die man im Web so findet.

    2. Hallo Martin,

      Soweit ich weiß, wird eine Variable, auch ein Eintrag in einem Array, beim ersten Zugriff darauf implizit erzeugt.

      Beim Schreiben darauf. Beim Lesen nicht.

      echo $_SESSION['username'];
      echo $_SESSION['username'];
      echo $_SESSION['username'];
      echo $_SESSION['username'];
      

      erzeugt viermal eine Notice, wenn der Eintrag nicht existiert.

      Schnelligkeit von Session Variablen.

      Das ist von $_SESSION unabhängig, das gilt für jeden Array-Zugriff. Arrays sind Hashmaps, und - soweit ich das jetzt weiß - Variablenscopes ebenfalls.

      Ein Variablenzugriff bedeutet also einen Hashzugriff, ein Zugriff auf ein Arrayelement sind zwei Hashzugriffe. Erst das Array im Scope finden, dann den Eintrag im Array.

      Möglicherweise weist PHP den $_... Superglobals eine Sonderrolle zu und optimiert die Zugriffe darauf, so dass nur ein Hashzugriff erforderlich ist.

      Möglicherweise optimiert PHP einen Arrayzugriff mit Stringliteralen, so dass der Hashkey bereits beim Generieren der Opcodes gebildet wird.

      Das müsste mal alles durch Benchmarks ausmessen und auch PHP Versionen vergleichen. Insbesondere könnte der JIT Compiler in PHP 8 hier deutliche Einflüsse haben.

      Unter dem Strich reden wir aber von Operationen, die auf modernen CPUs in Nanosekunden ablaufen. Wenn man für einen Webauftritt vor der Frage steht, ob man 1000 oder 1100 Server aufstellen muss, um die Last zu bedienen, dann sind solche Optimierungen interessant. Allerdings würde ich dann eher anfragen, ob PHP für solche Seiten die richtige Sprache ist.

      Ich persönlich neige dazu, bei mehr als zwei Zugriffen auf Arrayeinträge eine Temp-Variable anzulegen. Vermutlich, weil ich schreibfaul bin. Aber ich bin auch Jahrgang 1965 und wurde mit BASIC Dialekten von Commodore, Atari und TI digitalisiert, auf CPUs, die inclusive ihrer Chipsätze vom heutigen Niedervoltsilizium hundertfach schneller emuliert werden, als sie es selbst jemals waren.

      Rolf

      --
      sumpsi - posui - obstruxi
      1. Hallo Rolf,

        Aber ich bin auch Jahrgang 1965 und wurde mit BASIC Dialekten von Commodore, Atari und TI digitalisiert, auf CPUs, die inclusive ihrer Chipsätze vom heutigen Niedervoltsilizium hundertfach schneller emuliert werden, als sie es selbst jemals waren.

        schön auf den Punkt gebracht! 😀

        Live long and pros healthy,
         Martin

        --
        Früher war ich klein und dumm. Inzwischen hat sich so manches geändert. Ich bin größer geworden.