# Prinzipielle Vorteile REQUEST statt POST und GET?



## lay-z-cow (8. November 2007)

Hi,

ich würde gerne eine Frage in die Runde werfen:

Letztens hat mir ein anderer Programmierer erzählt, man solle bei der Auswertung von übergebenen Variablen immer nur Request, statt Post oder Get nutzen.

Ich war bisher immer der Meinung, genau das Gegenteil wäre richtig, da man ja sonst z.B. über die URL versuchen kann auf Variablen Einfluß zu nehmen, die eigentlich per POST verschickt werden sollten (Sicherheitslücke).

Nun wollte ich diesen Ratschlag aber nicht gleich als falsch abtun, sondern erstmal recherchieren. Bei google, php.net habe ich nichts in die Richtung gefunden.
Deswegen bin ich auf eure Meinung gespannt... 


Grüße

.:lay-z-cow:.


----------



## Dennis Wronka (8. November 2007)

Bei $_REQUEST hast Du den Nachteil dass Du nicht weisst woher die Daten kamen, denn in $_REQUEST hast Du alles was vom User kommt, also Daten aus $_POST, $_GET und $_COOKIE, alles zusammengepappt.
Wenn Du weisst woher Daten kommen sollen, dann nutze das entsprechende Array. Falls Daten aber sowohl ueber POST als auch GET kommen koennen, was ganz selten mal der Fall sein kann, dann hast Du die, meiner Meinung nach, einzige Situation gefunden wo $_REQUEST wirklich mal sinnvoll eingesetzt werden kann.
Ansonsten ist $_REQUEST fasst ein genau so grosser Pickel am A.... wie register_globals=on.


----------



## Nils Hitze (8. November 2007)

Ich benutz das was tatsächlich von MIR gesetzt wird .. halte es auch eher für eine Sicherheitslücke aber man lernt ja immer wieder was neues und ich bin auch gespannt ob sich dazu mal jemand Professionelles äussern könnte.


----------



## Michael Engel (8. November 2007)

Also ich verwende _POST _GET _COOKIE immer dann wenn vorher klar ist woher die Daten kommen.

An ein paar stellen kann es sein das die Variable auf mehere arten übergeben worden sein kann. Da habe ich bis jetzt meist _REQUEST verwendet. Ich kenne genug Programmierer die ohne Globals on nicht Programmieren können. Und auf Servern wo das Deaktiviert ist kommt das ihnen natürlich recht ,)

Oder sie verwenden Request gleich so:

```
foreach($_REQUEST as $key => $val) $$key = $val;
```

Also warum Request besser sein sollte entgeht mir jeglicher Phantasie wenn man vorher weis das Daten nur per GET ankommen. Oder nur per POST


----------



## Gumbo (8. November 2007)

Grundsätzlich die $_REQUEST-Variable als Datenquelle zu nutzen, hat vermutlich den ähnlichen Ursprung wie Register Globals: Bequemlichkeit und Unwissenheit. Denn man nicht die Kehrseite dieser Methode kennt, ist es leicht, sie als Non plus ultra anzupreisen, da man dabei ein Minimum an Denkleistung investieren muss: egal welcher Weg der Wert nimm, er steht in der $_REQUEST-Variable.
Doch die Kehrseite ist eben, dass dadurch Sicherheitslücken entstehen können oder vorhandene Sicherheitslücken einfacher ausgenutzt werden können. Denn die $_REQUEST-Variable ist nun mal die vereinigte Menge der per GET-Methode, POST-Methode und Cookie übergebenen Argumente, wobei ebendiese Reihenfolge auch die Gewichtung der Werte bestimmen (siehe variables_order-Konfigurationsoption), da ein vorhandenes GET-Argument von einem gleichnamigen POST-Argument überschrieben wird, was wiederum von einem gleichnamigen Cookie überschrieben wird. Damit ist nicht nur die Quelle des Werts genau bestimmbar, es können zudem auch keine gleichnamigen Argumente unterschiedlicher Quelle genutzt werden:
	
	
	



```
<?php

	if( !isset($_COOKIE['foobar']) ) {
		setcookie('foobar', 'cookie');
	}
	if( $_SERVER['REQUEST_METHOD'] === 'POST' ) {
		echo '<pre>';
		echo '$_GET["foobar"] = '.var_export($_GET['foobar'], true)."\n";
		echo '$_POST["foobar"] = '.var_export($_POST['foobar'], true)."\n";
		echo '$_COOKIE["foobar"] = '.var_export($_COOKIE['foobar'], true)."\n";
		echo '$_REQUEST["foobar"] = '.var_export($_REQUEST['foobar'], true)."\n";
		echo '</pre>';
	}

?><form action="?foobar=get" method="post">
	<input type="hidden" name="foobar" value="post">
	<input type="submit">
</form>
```

Auf Konstrukte wie Michael Engel ihn beschreibt, sollte übrigens auch verzichtet werden. Denn eine einfache Anfrage wie „http://example.net/foobar.php?GLOBALS“ löscht sämtliche Variablen. Und andere Manipulationen sind auch problemlos möglich.


----------



## Michael Engel (9. November 2007)

Oh Gott nein ich hoffe nicht das jemand das wirklich verwendet....  

Mir kahmen aber schon einige Skripte unter die Finger in denen Solche Kontrukte standen. Und das waren dann die Personen die auch _REQUEST verwendeten.


----------



## tobias_petry (9. November 2007)

Es gab vor ca. 12 Monaten mal im phpBB oder vB (einem von beiden) eine Sicherheitslücke als man auf Formaular-Daten mitteld _REQUEST Zugriff, man band mit dem Img-Befehl den Link ein und die gefakten Formulardaten als Get-Parameter und man konnte sich so zum Admin machen 
_REQUEST sollte man eigentlich nie verwenden, greift immer auf die reellen Datenquellen zu, denn die Sicherheitslücken, die entstehen können, sind viel zu groß.


----------

