Matthias: Sessionvariablen und file_get_contents

Hi,

ich habe ein Skript namens "makepdf.php", das in einem Popup geöffnet wird. Variablen in meiner Session sind innerhalb dieses Skripts aufrufbar, die Session existiert also und hat auch eine feste ID.

Nun rufe ich mit $status = $pipeline->process_batch($textpdf, $g_media);

eine Memberfunktion der Klasse Pipeline auf. Innerhalb dieser Klasse findet die Funktion file_get_contents($file) statt. $file ist eine URL. Diese URL lautet zum Beispiel bericht.php. Und hier liegt der Haken. Diese URL benötigt einige Sessionvariablen, z.B. einen in der Session gespeicherten Uernamen und ein Passwort, um die Leseberechtigung des Benutzers überprüfen zu können. Leider schaffe ich es nicht, das diese Variablen dem Skript in file_get_contents zur Verfügung stehen. Derzeit versuche ich es durch:

  • anhängen der SID=session_id() als Get-Variable
  • und in der URL mit session_id(strip_tags($_GET['sid']));
      session_start();

Dauert erstens eine Ewigkeit nun das Skript auszuführen, andererseits funktioniert es leider auch nicht, fehlermeldungen kommen "leider" auch keine.

Grüsse
Matthias

  1. Nun rufe ich mit $status = $pipeline->process_batch($textpdf, $g_media);

    eine Memberfunktion der Klasse Pipeline auf. Innerhalb dieser Klasse findet die Funktion file_get_contents($file) statt. $file ist eine URL. Diese URL lautet zum Beispiel bericht.php. Und hier liegt der Haken. Diese URL benötigt einige Sessionvariablen, z.B. einen in der Session gespeicherten Uernamen und ein Passwort, um die Leseberechtigung des Benutzers überprüfen zu können.

    Meinst du nicht auch, dass es reichlich idiotisch ist, wenn dein Skript - welches die Sessiondaten verfügbar hat - eine Methode aufruft, die sich via HTTP wieder mit sich selbst verbindet, um dort dann auf die gleichen Sessionwerte zurückzugreifen, die du sowieso schon verfügbar hättest?

    Das kostet dich erstens kräftig Performance (ein weiterer HTTP-Request vom Webserver ist belegt, das kostet vor allem Zeit), zweitens erfordert es potentiell unsichere PHP-Einstellungen (allow_url_fopen = on ist längst nicht mehr bei allen Providern anzutreffen, weil einfach zuviele schlecht geschriebene Skripte damit Schadcode included haben), und drittens kriegst du damit eben keinen Session-ID-Transfer über die mittlerweile zwischen dem Server und dem Browser ausgehandelte Session-ID-Transportmethode (Cookies oder GET) hin.

    Leider schaffe ich es nicht, das diese Variablen dem Skript in file_get_contents zur Verfügung stehen. Derzeit versuche ich es durch:

    • anhängen der SID=session_id() als Get-Variable

    Logischerweise darfst du die Konstante SID hier nicht verwenden, weil diese ja in Abhängigkeit der Akzeptanz von Cookies des Browsers belegt ist. Du mußt zwingend mit session_name() und session_id() arbeiten.

    • und in der URL mit session_id(strip_tags($_GET['sid']));
        session_start();

    Das wiederum ist kompletter Blödsinn. Einfaches session_start() reicht vollkommen aus. Den Rest macht PHP.

      • und in der URL mit session_id(strip_tags($_GET['sid']));
          session_start();

      Das wiederum ist kompletter Blödsinn. Einfaches session_start() reicht vollkommen aus. Den Rest macht PHP.

      Danke für die Antwort, ich verstehe bloss nicht, wie das mit dem session_name() gedacht ist. Wenn ich der Session einen neuen Namen geben, z.B. session_name("Test"), wie weiss dann die file_get_contents($file) diesen Namen, wenn ich nur session_start() mache ? Sry aber dem Leien fehlt gerade der Bezug.

      THX
      Matthias

        • und in der URL mit session_id(strip_tags($_GET['sid']));
            session_start();

        Das wiederum ist kompletter Blödsinn. Einfaches session_start() reicht vollkommen aus. Den Rest macht PHP.

        Danke für die Antwort, ich verstehe bloss nicht, wie das mit dem session_name() gedacht ist. Wenn ich der Session einen neuen Namen geben, z.B. session_name("Test"), wie weiss dann die file_get_contents($file) diesen Namen, wenn ich nur session_start() mache ? Sry aber dem Leien fehlt gerade der Bezug.

        Du gibst der Session ja auch keinen neuen Namen, du fragst den definierten Namen nur ab.

          • und in der URL mit session_id(strip_tags($_GET['sid']));
              session_start();

          Das wiederum ist kompletter Blödsinn. Einfaches session_start() reicht vollkommen aus. Den Rest macht PHP.

          Danke für die Antwort, ich verstehe bloss nicht, wie das mit dem session_name() gedacht ist. Wenn ich der Session einen neuen Namen geben, z.B. session_name("Test"), wie weiss dann die file_get_contents($file) diesen Namen, wenn ich nur session_start() mache ? Sry aber dem Leien fehlt gerade der Bezug.

          Du gibst der Session ja auch keinen neuen Namen, du fragst den definierten Namen nur ab.

          OK, der ist standardgemäss PHPSESSID, aber wie soll ich den per GET übergeben, dass die file_get_content URL die Sessionvariablen ebenfalls findet ?

          1. OK, der ist standardgemäss PHPSESSID, aber wie soll ich den per GET übergeben, dass die file_get_content URL die Sessionvariablen ebenfalls findet ?

            Genauso, wie PHP das von alleine auch tun würde, wenn ihm unbekannt ist, ob der Browser Cookies akzeptiert: url.php?SESSIONNAME=SESSIONID

            Großgeschriebene Schlagworte durch die Funktionsergebnisse ersetzen.

            1. meine Linkerstellungsfunktion lautet nun:

              $link_to_html[$i+1] .= $environment.$quelle[$i]["url"]."?".session_name()."=".session_id();

              meintest du das so

              Grüsse
              Matthias

  2. Hallo,

    überleg Dir doch einfach mal, wer denn üblicherweise Session-Variablen mitsendet. Na wer ist's?

    Richtig!

    Das macht ein HTTP-Client!

    Und wer führt die Funktion file_get_contents() aus? Na wer macht das nun?

    Richtig!

    Der Server macht das.

    Wie kann man dem Server nun beibringen, sich wie ein Client zu benehmen, um alle erforderlichen Parameter mitzusenden?

    Man bringt es ihm bei!

    Und wie?

    Na, indem man ihm vorschreibt, welche Daten (Parameter-Pärchen) er im Header des HTTP-Requests mitsenden muss an den anderen Server.

    Such doch mal nach "Post to Host" (eigentlich "Post von Host zu Host")

    http://www.php-faq.de/q/q-code-upload.html

    Das sollte Dich auf die richtige Spur bringen

    LG
    Hansi

    1. hi,

      überleg Dir doch einfach mal, wer denn üblicherweise Session-Variablen mitsendet. Na wer ist's?

      Richtig!

      Das macht ein HTTP-Client!

      Nö, der sendet lediglich die Session-ID im Request mit.

      Session-Variablen sind und bleiben auf dem Server.

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }