Wilhelm Turtschan: Sessions und der Validator

aloha heja he

Ich erstelle gerade Seiten fuer einen Hardware-Lieferanten. Die Preise bei den Angeboten sollen nur sichtbar sein, wenn ein bestimmter Freischaltcode eingegeben wurde.[1]

Soweit so gut, mit Session ja kein Problem.

Allerdings wird hinter dem einleitenden <form> ein Hiddenfeld mit der Session-Id eingefuegt, was laut Validator nach XHTML 1.0 strict hier nicht erlaubt sei:

<div id="navigation3">
[..blubb..]
<form method="post" action="php/anzeige.preis.php"><input type="hidden" name="PHPSESSID" value="90160c7cecfa2ab0b311ba6080c45776" />
<p>
Eingabe Preiscode<br />
<input type="text" size="4" name="preisanzeige" /><br /><input type="submit" value="freischalten" /><br />
<br />
<input type="hidden" name="preisarea" value="010" />
<input type="hidden" name="parmliste" value="0de02002001010" />
</p>
</form>
</div>

Ebenso werden die Links erweitert, das fehlerhafte & wird mit ini_set.. abgefangen.

Meine Fragen:

Versuche mit ini_set und den Parametern session..cookies waren vergeblich (vermutlich von mir falsch gesetzt), ebenso die Graberei im Archiv (wenn mal nicht gerade ausgelastet).

Der Link: http://www.pictum.de/kimbrer/page.phtml?pl=0de02002001020

Fuer den Validator auf das Bild links unten (Produkte) in der Fusszeile klicken.

man liest sich
Wilhelm

[1] Ueber die Sinnhaftigkeit braucht man mir nichts erzaehlen, der Kunde will es so, auch wenn ich eine gegenteilige Meinung vertrete.

  1. Moin!

    Allerdings wird hinter dem einleitenden <form> ein Hiddenfeld mit der Session-Id eingefuegt, was laut Validator nach XHTML 1.0 strict hier nicht erlaubt sei:
    Ebenso werden die Links erweitert, das fehlerhafte & wird mit ini_set.. abgefangen.

    Ist alles eine Frage deiner php.ini.

    Das & kannst du dort auch als & definieren (ini_set muß da nicht sein), und ebenso kannst du definieren (und auch abstellen), dass PHP automatisch jedes Formular erweitert. Ist ja nur dann relevant, wenn du mit trans_sid arbeitest.

    Ich denke, die Einstellungen in der php.ini erklären sich in diesem Punkt von selbst.

    Und wenn du deinem PHP abgewöhnt hast, hinter Formulare sofort das Hidden-Feld zu klatschen, mußt du es natürlich manuell an einer genehmen Stelle einfügen, und es auch ggf. nur im Bedarfsfalle dort reinpflanzen.

    Bedenke: <input type="hidden" name="<?php echo sessionname(); ?>" value="<?php echo sessionid(); ?>" />

    Wenn die Konstante SID nicht leer ist, muß das da oben rein.

    - Sven Rautenberg

    --
    "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
    1. aloha heja he

      Ist alles eine Frage deiner php.ini.
      Das & kannst du dort auch als & definieren (ini_set muß da nicht sein), und ebenso kannst du definieren (und auch abstellen), dass PHP automatisch jedes Formular erweitert. Ist ja nur dann relevant, wenn du mit trans_sid arbeitest.
      Ich denke, die Einstellungen in der php.ini erklären sich in diesem Punkt von selbst.

      Auf die php.ini habe ich in diesem speziellen Fall keinen Zugriff.

      Und wenn du deinem PHP abgewöhnt hast, hinter Formulare sofort das Hidden-Feld zu klatschen, mußt du es natürlich manuell an einer genehmen Stelle einfügen, und es auch ggf. nur im Bedarfsfalle dort reinpflanzen.

      Bedenke: <input type="hidden" name="<?php echo sessionname(); ?>" value="<?php echo sessionid(); ?>" />

      Wenn die Konstante SID nicht leer ist, muß das da oben rein.

      Werde mal ein bisschen rumprobieren. Danke.

      man liest sich
      Wilhelm

      1. Moin!

        Ich denke, die Einstellungen in der php.ini erklären sich in diesem Punkt von selbst.

        Auf die php.ini habe ich in diesem speziellen Fall keinen Zugriff.

        Sowas dachte ich mir schon fast. Aber du kannst in deine eigene ja mal reinschauen, das mit den Konfigurationsmöglichkeiten (siehe Thomas' Link) bei php.net abgleichen und dann eine passende .htaccess hochladen.

        Es ist jedenfalls keineswegs kompliziert. Wenn du die Automatik abstellst, mußt du alle Links manuell mit Session-IDs versorgen, das ist eklig (oder du hast eine Template-Engine, die das mal eben mitmacht bzw. ermöglicht). Wenn du nur das automatische Einfügen bei Formularen abstellst, könnte das Problem einfacher werden, weil Formulare deutlich seltener vorkommen und zentraler mit Hidden-Feldern versehen werden können, als Links.

        Bedenke: <input type="hidden" name="<?php echo sessionname(); ?>" value="<?php echo sessionid(); ?>" />

        Wenn die Konstante SID nicht leer ist, muß das da oben rein.

        Werde mal ein bisschen rumprobieren. Danke.

        Rum probieren ist auch lecker. :)

        - Sven Rautenberg

        --
        "Habe den Mut, dich deines eigenen Verstandes zu bedienen!" (Immanuel Kant)
        1. aloha heja he

          Sowas dachte ich mir schon fast. Aber du kannst in deine eigene ja mal reinschauen, das mit den Konfigurationsmöglichkeiten (siehe Thomas' Link) bei php.net abgleichen und dann eine passende .htaccess hochladen.

          Ich habe jetzt mal die .htaccess so angelegt wie von Thomas beschrieben. Scheint alles zu funktionieren, auch wenn ich nicht ganz weiss warum. :-)

          Was mir vorher noch aufgefallen ist:
          In der Quellansicht von Firefox war nichts von PHPSESSID zu sehen, dagege im Epiphany schon. Nach der .htaccess zeigt Epiphany auch nichts mehr an. Machen die Browser das unterschiedlich?

          Rum probieren ist auch lecker. :)

          Wortverdreher. :-)

          man liest sich
          Wilhelm

          1. Hallo,

            Ich habe jetzt mal die .htaccess so angelegt wie von Thomas beschrieben. Scheint alles zu funktionieren, auch wenn ich nicht ganz weiss warum. :-)

            Wenn session.use_trans_sid "0" ist, unterlaesst PHP das
            automatische Anhaengen der Session-ID an relative URLs
            und das automatische Hinzufuegen von Hidden-Fields
            mit der Session-ID bei Formularen.

            Wenn Du weiter nichts unternimmst, funktionieren dann
            Sessions bei Dir nur noch, wenn der Benutzer Cookies
            akzeptiert.

            Lies Dich "richtig" ins Thema Sessions ein, wenn Du
            sie schon benutzt.

            http://www.php.net/manual/de/ref.session.php
            http://www.dclp-faq.de/ch/ch-version4_session.html
            u.s.w.

            Gruesse,

            Thomas

            --
            Bitte keine Mails mit Fachfragen - dafuer gibt es das Forum!
            Ich mag es, wenn URLs verlinkt sind (</faq/#Q-19>).
            Oft gestellte PHP-Fragen beantwortet die dclp-FAQ bestens: http://www.dclp-faq.de/
            1. aloha heja he

              Wenn Du weiter nichts unternimmst, funktionieren dann
              Sessions bei Dir nur noch, wenn der Benutzer Cookies
              akzeptiert.

              Dies hatte ich herausgelesen und werde es ggf. noch abfangen, obwohl bei der Zielgruppe die Aktivierung von Cookies gegeben sein duerfte.

              Lies Dich "richtig" ins Thema Sessions ein, wenn Du
              sie schon benutzt.

              "Richtig" kommt immer auf den Blickwinkel an. ;-)

              Fuer die bisher benotigten Session-Verwendungen reichte die Standardvorgehensweise voellig aus. Sicherheitsaspekte waren da auch nicht so gross geschrieben, wie bei heutigem Beispiel. (Kunde will nicht, dass ein bestimmter Konkurrent die Preise sieht und mit seinen Angeboten immer billiger ist. Er soll sich selber die Muehe machen. *g*) Ich stolperte nur wegen der Validierung Xhtml strict darueber.

              http://www.php.net/manual/de/ref.session.php
              http://www.dclp-faq.de/ch/ch-version4_session.html

              Die Links sind mir zur Genuege bekannt. Ich pflege normalerweise die Wuehlarbeit, aber irgendwie war mir das heute zu verwirrend geschrieben. Also bemuehte ich mal das Forum um Hilfe.

              man liest sich
              Wilhelm

  2. Hallo,

    Dein "Problem" haengt offenbar mit dem Fallback zusammen.

    Wie übergebe ich Session-IDs ohne Cookies an eine andere Seite?
    Was ist Fallback?
    http://www.dclp-faq.de/q/q-sessions-fallback.html

    session.use_trans_sid
    ist wie folgt aenderbar:
    PHP_INI_SYSTEM
      => in der php.ini oder httpd.conf
    PHP_INI_PERDIR
      => in der .htaccess, Deine Chance! ;-)

    http://www.dclp-faq.de/q/q-konfiguration-laufzeit.html

    <IfModule mod_php4.c>
      php_value session.use_trans_sid 0
    </IfModule>

    Gruesse,

    Thomas

    --
    Bitte keine Mails mit Fachfragen - dafuer gibt es das Forum!
    Ich mag es, wenn URLs verlinkt sind (</faq/#Q-19>).
    Oft gestellte PHP-Fragen beantwortet die dclp-FAQ bestens: http://www.dclp-faq.de/
    1. aloha heja he

      Dein "Problem" haengt offenbar mit dem Fallback zusammen.

      und mit der Eitelkeit keinen Fehler zu kriegen. :-)

      Wie übergebe ich Session-IDs ohne Cookies an eine andere Seite?
      Was ist Fallback?
      http://www.dclp-faq.de/q/q-sessions-fallback.html

      Klang beim Lesen "furchtbar" kompliziert. Mir duenkt da noch was von Klasse einbinden und so.

      Ich hab mal mit dem Provider gequatscht, PHP laeuft als Modul, also werde ich auf die .htaccess losgehen.

      Danke.

      man liest sich
      Wilhelm

  3. Hallo Wilhelm,

    ini_set ('session.use_trans_sid', 0); vor session_start(). - allerdings erst ab PHP5.

    PHP4 kann man aber austricksen: ini_set ('url_rewriter.tags', ''); vor session_start().

    Siehe auch: http://bugs.php.net/bug.php?id=24693

    Viele Grüße,
    Christian

    1. aloha heja he

      ini_set ('session.use_trans_sid', 0); vor session_start(). - allerdings erst ab PHP5.

      PHP4 kann man aber austricksen: ini_set ('url_rewriter.tags', ''); vor session_start().

      Hmmh, Bugs nuetze ich eigentlich nicht so gerne aus, er koennt ja mal korrigiert werden.

      BTW: Deine "webmaster"-Box hat was fuer Dich. :-)

      man liest sich
      Wilhelm

      1. Hallo Wilhelm,

        Hmmh, Bugs nuetze ich eigentlich nicht so gerne aus, er koennt ja mal korrigiert werden.

        Das ist ja kein Bug, nur eine andere Einstellung. Und wenn Du ganz paranoid bist, machst Du:

        @ini_set ('url_rewriter.tags', '');
        @ini_set ('session.use_trans_sid', 0);

        Letzteres geht ja ab PHP5 und vorher wird das Verhalten der Einstellung url_rewriter.tags mit Sicherheit nicht geändert.

        BTW: Deine "webmaster"-Box hat was fuer Dich. :-)

        Schon bekommen und geantwortet. :-)

        Viele Grüße,
        Christian

  4. aloha heja he

    Die Seite ist auf die richtige Domain umgezogen.

    man liest sich
    Wilhelm