gechger
Goto Top

PHP Prüfung, ob ein submit Button betätigt wurde

Könnt Ihr mir bei einem Verständnis Problem helfen?

Hallo Forum,

In einem Eingabeformular übergebe ich eingegebene Daten an ein weiteres Formular, dann noch einmal an ein anderes Formular. Je nachdem, welcher Submit Button gedrückt wurde, soll über eine IF-Abfrage gesteuert werden, was der Benutzer sieht.

In meinen ersten Versuchen habe ich das über eine solche Abfrage gemacht:

if (isset($_REQUEST=['name des submit Buttons']))}


aber habe nun gelesen, daß der $_REQUEST unsicher ist.
Wie könnte man das anders lösen? Macht der $_POST das Gleiche?
Gibts vielleicht einen komplett anderen Ansatz?

Ziel ist folgendes:
- Eingabeformular
- Submit
- Abfrage aus MySQL Datenbank
- neues Eingabeformular zur Auswahl der im Array stehenden Daten
- Submit
- Ausgabe des selektierten Datensatzes
- Änderung des selektierten Datensatzes
- Submit
- Änderung durchführen in der Mysql Datenbank

Vielen Dank für jede Idee.

Schöne Grüße
Christof

Content-ID: 122932

Url: https://administrator.de/contentid/122932

Ausgedruckt am: 25.11.2024 um 06:11 Uhr

nxclass
nxclass 17.08.2009 um 22:35:23 Uhr
Goto Top
$_REQUEST beinhaltet die Daten aus $_POST und $_GET - wenn Du das Formular per method="post" abschickst kannst Du natürlich auch $_POST benutzen.

Ich kann allerdings nicht verstehen was 'unsicher' (unsicherer) sein soll an $_REQUEST - POST Daten kann man genauso manipulieren wie GET Daten.

Mann könnte in dem Formular ein type="hidden" input Feld einfügen welche die auszuführende Action enthält - bzw. diese direkt in der URL angeben. In PHP könnte man nun diese 'action' auswerten und eine Funktion aufrufen. - Die meisten Frameworks arbeiten auf diese weise.
godlie
godlie 17.08.2009 um 22:48:18 Uhr
Goto Top
Hallo,

ob ich nun ein Formular per POST abschicke und dann den Submit Button checke oder einen input type=hidden
is ja untern Strich das gleiche.
Beides ist mit geringen Kenntnissen manipulierbar.
Eine Sichere Übertragung glaub ich geht eh nur über ssl wobei ich mir hier auch nicht sicher bin ob ich diese nicht auch manipulativ sind...
Cubic83
Cubic83 17.08.2009 um 22:55:52 Uhr
Goto Top
Zitat von @godlie:
Hallo,

Eine Sichere Übertragung glaub ich geht eh nur über ssl
wobei ich mir hier auch nicht sicher bin ob ich diese nicht auch
manipulativ sind...

Blödsinn. SSL sichert nur die Verbindung zwischen Server und Client und ändert absolut gar nichts an der Problematik!!!! Was hin und her transportiert wird kann nach wie vor manipuliert werden!
dog
dog 17.08.2009 um 23:11:44 Uhr
Goto Top
Ich kann allerdings nicht verstehen was 'unsicher' (unsicherer) sein soll

Ganz einfach: REQUEST ist eine Sammelbox für POST,GET,SERVER,ENV...

Und damit könnte auch folgender Code in irgendeinem Forum eine if(isset($_REQUEST['account_loeschen']) Abfrage triggern:

<img src="http://meinebank.de/action.php?account_loeschen=1" />

Natürlich löst POST das eigentliche Sicherheitsproblem hier nicht wirklich sondern macht es nur schwerer.
Ein wirklicher Schutz gegen CSRF wird über Shared-Secrets gemacht.

Anders ausgedrückt:
In jedem Formular muss sich auch immer ein hidden-Feld mit einer sich ständig verändernden Zufallskombination befinden um sicherzustellen, dass das Formular von legitimer Quelle aus abgesendet wurde.

Siehe dazu auch: request_order und variables_order in php.ini

Grüße

Max
EvilMoe
EvilMoe 18.08.2009 um 06:33:22 Uhr
Goto Top
Eine Zufallskombination würde mich aber davon nicht abhalten. Man braucht diese ja einfach einlesen und übertragen. Die anderen Felder kann ich manipulieren. Das würde vielleicht nur "anfänger" davon abhalten.
Aber ein hidden Feld lässt sich nunmal ohne Probleme auslesen.

Man könnte natülrich den "referrer" prüfen. Allerdings wird der nicht immer übertragen und lässt sich auch manipulieren.
maretz
maretz 18.08.2009 um 07:10:37 Uhr
Goto Top
Naja - das Zufallsfeld zusammen mit ner Gültigkeit wäre eine Möglichkeit... Auch wenn keine besonders sichere (da die Eingaben ja auch einfach zu langsam gemacht worden sein können).

Was man m.E. machen kann: Über die Session gehen -> wenn der Zufalls-Hash nicht mit dem Hash in deiner aktiven Session übereinstimmt (oder du gar keine aktive Session hast!) DANN wirst du rausgekickt... Damit dürfte das dann schon schwer werden das ganze zu manipulieren -> schickst du vom anderen Rechner einfach das Formular neu stimmen deine Session-Daten nicht mehr (da du die nicht geöffnet hast). Dh. Hash stimmt zwar - aber Session fehlt -> Kick in the Ass ;). Damit helfen dir die reinen Felder gar nichts mehr...
nxclass
nxclass 18.08.2009 um 08:18:50 Uhr
Goto Top
... also der 3. Absatz bezog sich nur auf die Frage nach einem anderen Ansatz.

Wenn Du das selbe Formular mehrfach benutzt könnte es sich lohnen eine eigenes Objekt dafür zu erzeugen was die Formularfelder, die Actions und noch andere Funktionen a'la Form-Feld-Validierung enthält.
... wie gesagt: Frameworks wie Zend ( http://framework.zend.com/ ) und Symfony ( http://www.symfony-project.org ) geben da gute Beispiele.
dog
dog 18.08.2009 um 15:19:34 Uhr
Goto Top
Moment...

Ihr schmeißt hier grade einige Netzwerktopologien durcheinander.

Man braucht diese ja einfach einlesen und übertragen.

Bei einer normalen Internetnutzung (also ein Benutzer hinter Router) sind Shared-Secrets und Session-Cookies der Way-To-Go, weil du sie eben nicht auslesen kannst. (Wo denn auch?)
Lies dir einfach mal den Wikipedia-Artikel zum Thema CSRF durch, dann verstehst du, warum Shared-Secrets pflicht sind.
Auch einen Zufalls-Hash in der Session zu speichern ist kein wirksamer CSRF-Schutz, weil man die Session-Daten ja immer mit sich rumträgt (siehe dazu mein Beispiel von oben)

Wenn du hier aber von einem Firmennetzwerk redest, bei dem der Admin einfach mit Wireshark mitlauschen könnte muss natürlich zu den Shared-Secrets auch noch HTTPS verwendet werden.
Das ist aber ein grundsätzliches Problem von HTTP: In einer genatteten Umgebung ohne SSL ist es immer Möglich z.B. per Interception-Proxy alle Daten zu klauen.

Grüße

Max
EvilMoe
EvilMoe 18.08.2009 um 16:37:04 Uhr
Goto Top
Zitat von @dog:
Moment...

Ihr schmeißt hier grade einige Netzwerktopologien
durcheinander.

> Man braucht diese ja einfach einlesen und übertragen.


Ich meinte damit nicht Sessions oder Cookies sondern ein unsichtbares Feld im Formular
gechger
gechger 18.08.2009 um 19:26:19 Uhr
Goto Top
wow, ist das viel Stoff.
Erstmal vielen Dank an Euch alle für diesen vielen Tips. Ich werde mir dann also erstmal Eure Links zu Gemüte führen und bei Fragen gerne auf Euch zurück kommen. Als relativer Newbie sind mir die ganzen Sicherheitsaspekte im php Bereich noch unvertraut. Aber ich sehe, daß man diesen Aspekt immer zu berücksichtigen hat.

Schöne Grüße
Christof
N0ooo0B
N0ooo0B 22.08.2009 um 11:31:51 Uhr
Goto Top
<?php

if(isset($_POST["submit"])) {

echo "abgeschickt";
}

?>
<form method="post" action="">
<input type="submit" name="submit">
</form>


so funktions kannste ja als beispiel nehmen