PHP Variable übergeben (?name=content)

S

sevY

Hi,

just basics, aber ich wollt das trotzdem mal in die Runde werfen.

Ich überlege gerade folgendes:

Bisher habe ich Variablen aus zb Navigationen mit seite.php?varname=varinhalt übergeben und auf der entsprechenden Seite dann als $varname zur Verfügung gehabt.

Da ich in letzter Zeit nur CMS und Admintools, sowie Bridges für Flash programmiert habe und dazu in 99% aller Fälle Formularfelder zur Eingabe/Übergabe von Daten verwandt habe, nutze ich immer die im Form die Methode „POST“. POST und GET stehen soviel ich weiß auch nur in Forms zur Verfügung.

Auf meinem Testserver als auch auf unserem Kundenserver sind seit dem letzten PHP Upgrade register_globals=off; (das auch so gewollt ist) und ich frage mich gerade, wie ich Variablen sicher übergeben kann.

Soll ich die Variablen nun als Sessionvariable initialisieren?
Wäre etwas übertrieben für eine einfache Navigation, oder?

BTW… seite.php?varname=varinhalt funktioniert doch auch gar nicht mit den globals off, oder?

Liebe Grüße

Yves
 
Hi,

ich nutze meist folgenden Ansatz:

Navi-Parameter und andere relevante Werte außerhalb von Formularen werden per GET weitergereicht, aber abstrahiert.
Statt url?seite=bla&sub=blub&detail=blib&print=no kann das zB url?nav=1,2,3,0 heißen.

Die Variable wird temporär ausgelesen, zerlegt und hierarchisch auf Gültigkeit und Relevanz geprüft mit
PHP:
$arrNavTemp = explode (",", $_GET['nav']);
... Prinzip ist, daß alle möglichen internen Navi-Parameter in einem Array definiert wurden und erst nach erfolgreicher Prüfung mit den für Seitenaufbau, Includes usw relevanten Werten beliebiger Art versehen werden.

Sessions wären eine weitere gute Möglichkeit, aber ich halte die o.g. Methode für schneller und durchsichtiger.

cheers, me
 
Hi,

explode() ist mir als Befehl bekannt.

Durch die Zerteilung des Arrays, der übergeben wird, erzielst den Vorteil, das dem User die übergebenen Inhalte verschleiert werden, oder?

Kannst du das mal kurz an einem Beispiel erläutern, wie du das genau meinst?

Zb. die Variable $var1 und $var2 von start.php nach target.php übergeben.

$_GET brauchte ich interessanterweise auch während der ganzen Zeit nicht, da ich das immer mit Sessions realisiert hatte, mir das nun aber wie du auch schon sagtest, etwas zu übertrieben scheint.

Wenn ich das richtig verstehe benutzt man $_GET, wenn die globals nicht registriert werden, um an die Vars aus der Browserzeile zu gelangen, oder?


Liebe Grüße

Yves
 
Hi,

so ganz verstehe ich deine Frage nicht, aber ich versuche dir trotzdem mal zu helfen..

Wenn man Variablen über die URL übergibt (seite.php?var1=wert1&var2=wert2), so nennt man dies die GET-Methode.
In Formularen verwendet man überlicherweise die POST-Methode, d.h. die Werte werden direkt an den Server übertragen und nicht im URL-Request angegeben. Aber auch in Formularen kann man die GET-Methode benutzen, halte ich jedoch nicht für sehr sinnvoll.

In PHP hast du nun drei Arrays zur Verfügung, um an die übergebenen Werte heran zu kommen:

$_GET: In diesem Array sind alle per GET übergebenen Variablen enthalten (Bsp. echo $_GET['var1']).

$_POST: In diesem Array sind logischerweise alle per POST übergebenen Variablen vorhanden.

$_REQUEST: Nicht selten kann es auch einmal vorkommen, dass ein und die selbe Variable mal über die POST- und mal über die GET-Methode übergeben wird. Dafür gibt es eben dieses Array.. darin befinden sich alle Variablen die per GET oder POST übergeben wurden. Im Notfall bist du mit diesem Array also immer auf der sicheren Seite..

Die alte Methode bei der man auf eine übergebene Variable per $variablen-name zugreift sollte man - selbst wenn sie aktiviert ist - nicht mehr benutzen. Sie ist eben ein Sicherheitsrisiko..

Ciao
 
Hi Zeeke,

mir ist schon bewusst wie $_GET usw. funktioniert und wie ich die Variablen versenden kann.

Aber ich würde das ganze gerne vor „Injection“ wenigstens halbwegs schützen.

Ein Beispiel:

PHP:
<?php
if(isset($_GET['var']))
    {
    echo $_GET['var'];
    }
else
    {
    echo "<a href=test.php?var=success>test</a>";
    }
?>


Du siehst nach Betätigen des Links in der Browserzeile die Anchor-Reference, auf die mit $_GET zugegriffen wird. Man kann nun als User ohne Probleme das Wort 'success' beliebig verändern. Bei einer Navigation ist das ja nicht weiter schlimm, aber ich überlege wie man das trotzdem anders übergeben könnte. Also vermeintlich sicherer, sodass der User nicht den Varnamen/Inhalt direkt mitbekommt.

Also ist einfach nur ein Gedanke. Sicherheitssensitive Informationen werden, sofern es Usereingaben sind, eh mit $_POST übergeben bzw. als Sessionvariable o.ä. initialisiert un prinzipiell wüsste ich jetzt auch nicht, wo die typische „offene“ GET-Methode Probleme machen sollte.

Das 2. Posting dieses Threads hat aber eigentlich schon den Kern getroffen.

Weisst du was ich meine?#


Liebe Grüße

Yves
 
Jepp, habe ich nun :)

Original geschrieben von Yves
Also ist einfach nur ein Gedanke. Sicherheitssensitive Informationen werden, sofern es Usereingaben sind, eh mit $_POST übergeben bzw. als Sessionvariable o.ä. initialisiert un prinzipiell wüsste ich jetzt auch nicht, wo die typische „offene“ GET-Methode Probleme machen sollte.
&nbsp;

Sie könnte wohl z.B. dort Probleme machen, wo Dateien (schlimmstenfalls noch mit Pfaden) per GET übergeben werden.. jenachdem.

Ciao
 
Original geschrieben von Yves
Hi,

explode() ist mir als Befehl bekannt.

Durch die Zerteilung des Arrays, der übergeben wird, erzielst den Vorteil, das dem User die übergebenen Inhalte verschleiert werden, oder?

Unter anderem. Der Punkt ist, daß die übergebenen (nummerischen) Werte bereits definierte Entsprechungen im Klartext haben, mit denen PHP intern arbeitet, um zB die richtigen Includes einzubinden.

Außerdem läßt sich sich so die Gültigkeit der Parameter sehr einfach abprüfen und ggf eine eigene Fehlermeldung oder Ersatzseite anzeigen - ich will vermeiden, daß der normale User ohne sinnvolles Feedback ins Leere läuft und auch die Skript-Kiddies sollen keine PHP/SQL-Fehler mit absoluten Pfaden zu sehen bekommen. ;)

Kannst du das mal kurz an einem Beispiel erläutern, wie du das genau meinst?

Zb. die Variable $var1 und $var2 von start.php nach target.php übergeben.

Ich sehe die beiden Variablen mal als Navi-Parameter für Level 1 und Subnavi an. Die Navi wird zB so definiert:
PHP:
// Variablen-Deklaration
$navURL = $_SERVER['PHP_SELF'];

$navSeite = 1;
$navSub = 0;

$arrSeiten = array ("NULL","Home","Hotels","Impressum","VOID");

$arrNavStruktur = array (
	0 => array ("Home"),
	1 => array ("Home","Reisen Aktuell","Wir &uuml;ber uns"),
	2 => array ("Hotels","Suchen und Finden","kurze Erl&auml;terung","Glossar","Hotelausstattung","meine Auswahl"),
	3 => array ("Impressum"),
	4 => array ("Home")
);

$arrSeiten hat drei gültige Navi-Punkte von Position 1 bis 3 im Array, NULL und VOID könnten auch "Uwe" heißen und sind nur zum Abfangen da. $arrNavStruktur ordnet jedem Punkt in $arrSeiten die möglichen Punkte der Subnavi zu - ist wie bei "Impressum" nur eine Seite vorgesehen, gibt es auch nur den einen Punkt im Array.

Klicke ich in der Seite auf "Hotels", sieht der Link so aus: index.php?nav=2,0 ... wobei die "2" deine $var1 und die "0" deine $var2 wäre. $var1 wird im Array $arrSeiten aufgelöst, $var2 pickt die entsprechende Position aus $arrNavStruktur. Als Ergebnis wird die grafische Navi, Seitentitel und Inhalte usw passend aufgebaut.

Geprüft in Abhängigkeit von der Länge der obigen Arrays und für die weitere Verarbeitung im Skript definiert wird - vereinfacht - so:
PHP:
// Navigations-Parameter pruefen und fuer Navi definieren
if ($_GET["nav"]) {
	$arrNavParameter = explode (",", $_GET["nav"]);

	if (((int) $arrNavParameter[0] >= 1) && ((int) $arrNavParameter[0] < (count ($arrNavStruktur) - 1))) {
		$navSeite = (int) $arrNavParameter[0];
	}

	if (((int) $arrNavParameter[1] >= 1) && ((int) $arrNavParameter[1] < (count ($arrNavStruktur[$navSeite])))) {
		$navSub = (int) $arrNavParameter[1];
	}
}


$_GET brauchte ich interessanterweise auch während der ganzen Zeit nicht, da ich das immer mit Sessions realisiert hatte, mir das nun aber wie du auch schon sagtest, etwas zu übertrieben scheint.

Wenn ich das richtig verstehe benutzt man $_GET, wenn die globals nicht registriert werden, um an die Vars aus der Browserzeile zu gelangen, oder?

Genau ... und weil es Funktion und Sicherheit der Seite dient, nicht ungeprüft alles zu fressen, was in der URL steht. Wenn du also "Blubb" als Wert von $var1 übergeben willst und "Blubb" bekannt ist (anders als Eingaben in Kontaktformularen!), kannst du "Blubb" für die komplette Site zb den Wert "5" zuweisen und nur diesen in der URL weiterreichen. In der empfangenden Seite fragst du: Gibt es Parameter? Ist der Wert eine Zahl? Ist diese Zahl gültig? ... Wenn ja, wird 5 wieder in "Blubb" übersetzt.

cheers, me
 
Hi Brandhoff,

sehr schönes Beispiel! Vielen Dank :) Das werde ich so machen.

Liebe Grüße

Yves
 
Dann viel Spaß beim experimentieren :)

Diese Methode ist m.E. relativ mächtig, weil die einmal als gültig geprüften Navi-Parameter als Zahlen und ggf entsprechenden Text-Werten (oder was auch immer) vorliegen. Damit lassen sich zB mit einfachen Schleifen komplette Navigationen mit je nach Status wechselnden Grafiken und/oder CSS-Stilen, Alt-Tags, Title-Tags usw bauen, die einmal für die ganze Site in einem Array definiert werden und ab da komplett generisch sind (also eine Funktion/Include-Datei für jede denkbare Navigation).

Wenn du es weiterspinnen willst, bieten sich auf diese Art auch Schalter für Suchmasken und -Ergebnisse, Formulare mit Fehlerhandling und Feedback, Screen- oder Print-Layout usw an ...

Schönes Wochenende!
 
Original geschrieben von Brandhoff
Wenn du es weiterspinnen willst, bieten sich auf diese Art auch Schalter für Suchmasken und -Ergebnisse, Formulare mit Fehlerhandling und Feedback, Screen- oder Print-Layout usw an ...
&nbsp;

Ja da ging mir auch schon ein Licht auf, da ich zb Forms immer sehr umständlich mit selbstgebauten, verschachtelten Funktionen und entsprechenden Returns geprüft habe. Mit deiner Methode könnte man das verfeinern und abstrakter auf der Ebene des Überprüfens halten.

Ich werde nach dem aktuellen Projekt mal ein wenig damit herumspielen.


Ebenso ein schöne WE und Grüße aus Dortmund

Yves
 
hiho

ich find auch dass hier nicht die anwendung von sessions nötig is

ab php4.1 sind egpcs-werte in speziellen arrays verfügbar

z.b:
-) $REQUEST enthält alles in $_GET, $_POST und $COOKIE
-) $SERVER enthält die variablen fürn server (httpzeigs halt)

somit:
PHP:
<?php
	$username = $_REQUEST['username'];
	$password = $_REQUEST['password'];
	$PHP_SELF = $_SERVER['PHP_SELF'];
	
	if($username == 'user' and $password == 'pwd') $authorized = true;
	
	if (!$authorized):
?>
<form action="<?=$PHP_SELF?>" method="POST">
	<input type="text" name="username">
	<input type="password" name="password">
	<input type="submit">
</form>
<?php else: ?>
	supergeheimerinhalt
<?php endif; ?>
also mit abgeschalteten register_globals

so ist auch sicherheit gegeben... mit http://mysite.com?authorized=1 kommt man nicht auf die "supergeheime-site"

mfg eyz
 
Zurück
Oben Unten