PHP [cURL] Cookies werden (wohl) nicht korrekt mitgeschickt

hemorieder

Lieutenant
Registriert
März 2003
Beiträge
649
Hey,

ich bastle gerade an einem Skript, dass ein Formular aufruft und abschickt.
Anschließend will ich nur das Ergebnis des abgeschickten Formulares sehen.

Aus einem mir nicht nachvollziehbaren Grund, wird (glaube ich) die Session nicht beibehalten.
Wenn ich mir die entscheidenen Parameter auslesen lasse, JESSIONID und timestamp, so sind diese beide gefüllt.
Auf der original Seite kann man das Problem, welches das Skript erzeugt, wie folgt reproduzieren:

1. Seite aufrufen: https://igv-kfz.regioit.de/verkehr-igv/servlet/Internetgeschaeftsvorfaelle?AUFRUF=WKZ_BN
2. Auf "Suchen" drücken (mit oder ohne Eingabe)
3. Nun (nachdem man das Ergebnis sieht) in die Adresszeile gehen und "Enter" drücken

--> Ihre Eingaben konnten leider nicht übernommen werden, da Sie die Navigationsbuttons Ihres Browsers benutzt haben. Bitte wiederholen Sie Ihre Eingabe und klicken Sie anschließend auf die Buttons (zurück oder weiter) am Seitenende, um weiter auf der Webseite zu navigieren.

Hier mein Skript dazu:

PHP:
<?php
// Ziel-URL (https)
$url = "https://igv-kfz.regioit.de/verkehr-igv/servlet/Internetgeschaeftsvorfaelle?AUFRUF=WKZ_BN";

// cURL-Initialisierung
$ch = curl_init();

// User-Agent für die neueste Firefox-Version
$userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0";

// cURL-Optionen für die ursprüngliche Anfrage setzen
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent); // Neueste Firefox-Version
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Deaktivieren der SSL-Überprüfung

// Anfrage ausführen und Header mit Cookies speichern
curl_setopt($ch, CURLOPT_HEADER, 1);
$response = curl_exec($ch);

// JSESSIONID-Cookie auslesen aus Header
$jsessionid = null;
$cookies = [];
preg_match_all('/Set-Cookie: (.*?);/i', $response, $cookies);
foreach ($cookies[1] as $cookie) {
    if (strpos($cookie, 'JSESSIONID') !== false) {
        $jsessionid = $cookie;
        break;
    }
}

// ZEITSTEMPEL aus der Seite auslesen
preg_match("/name='ZEITSTEMPEL' value='(.*?)'/", $response, $zeitstempelMatch);
$zeitstempelValue = $zeitstempelMatch[1];

// cURL-Sitzung schließen
curl_close($ch);

// Daten für das Formular
$formData = [
    'INPUT-TXT_KENNZEICHENSUCHE_ERKENNUNGSZEICHEN' => 'ZZ',
    'INPUT-TXT_KENNZEICHENSUCHE_ZIFFERN' => '1011',
    'INPUT-OPT_KENNZEICHENSUCHE_BESONDERHEIT1' => 'NULL',
    'ZEITSTEMPEL' => $zeitstempelValue // ZEITSTEMPEL-Wert hinzufügen
];

// cURL-Initialisierung für Formularsendung
$ch = curl_init();

// cURL-Optionen für das Formular setzen
$formSubmitUrl = "https://igv-kfz.regioit.de/verkehr-igv/servlet/Internetgeschaeftsvorfaelle"; // Anpassen zur tatsächlichen URL
curl_setopt($ch, CURLOPT_URL, $formSubmitUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($formData));
curl_setopt($ch, CURLOPT_COOKIE, $jsessionid); // JSESSIONID setzen
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent); // Neueste Firefox-Version
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Deaktivieren der SSL-Überprüfung (nicht empfohlen in Produktionsumgebungen)

// Formular senden
$response = curl_exec($ch);

// Überprüfen auf Fehler
if ($response === false) {
    echo 'Fehler: ' . curl_error($ch);
} else {
    echo 'Antwort: ' . $response;
}

// cURL-Sitzung schließen
curl_close($ch);
?>

Habt ihr einen Grund, wieso das nicht klappt?
 
Zuletzt bearbeitet:
Ja das kommt ab und an vor, aber auch nicht immer.
Ich habe es mal hinzugefügt, aber das Problem ist existent:

PHP:
curl_setopt($ch, CURLOPT_URL, $formSubmitUrl . ';jsessionid=' . $jsessionid); // JSESSIONID zur URL hinzufügen
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($formData));
curl_setopt($ch, CURLOPT_COOKIE, $jsessionid); // JSESSIONID setzen

Ich habe irgendwie den Eindruck, dass diese zwei cURL Sessions nicht sauber laufen.
 
Naja das oben kann ja nicht richtig sein, was steht in der $jsessionid variable?
jsessionid=ABCDE, oder nur ABCDE?
 
Tornhoof schrieb:
Naja das oben kann ja nicht richtig sein, was steht in der $jsessionid variable?
jsessionid=ABCDE, oder nur ABCDE?
stimmt, sorry.

PHP:
curl_setopt($ch, CURLOPT_URL, $formSubmitUrl . ';' . $jsessionid); // JSESSIONID zur URL hinzufügen
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($formData));
curl_setopt($ch, CURLOPT_COOKIE, $jsessionid); // JSESSIONID setzen

ändert leider nix
Ergänzung ()

Yuuri schrieb:
Warum schlägst du dich eigentlich mit curl rum? Sieh dir httpful, Guzzle, Symfonys Http Client und Co an. Das macht die Arbeit um Einiges leichter und nimmt dir das Session Handling auch komplett ab. Notfalls kannst du auch direkt mit file_get_contents() und dem $context Parameter arbeiten (siehe stream_context_create()). Alles ist besser als mit curl zu hantieren.
Danke für den Tipp, aber alle Pakete laufen leider nicht auf meinem extern gehosteten Webserver
Ergänzung ()

file_get_contents kann ich nicht nutzen weil allow_url_fopen=0 gesetzt ist. :(
 
Zuletzt bearbeitet:
Dein $formData stimmt nicht, Du musst da das "name"-Attribut des Input-Felds nehmen, nicht das "id"-Attribut, also "WKZ_ERKENN_Z" und so weiter in dem Fall.
 
habe ich angepasst, ändert nix:

PHP:
$formData = [
    'WKZ_UNTERSCH_Z' => 'BN',
    'WKZ_ERKENN_Z' => 'ZZ',
    'WKZ_ZIFFERN' => '1011',
    'WKZ_SUCHMERKMAL' => 'NULL',
    'ZEITSTEMPEL' => $zeitstempelValue // ZEITSTEMPEL-Wert hinzufügen
];
 
Zurück
Oben