Sven Rautenberg: sicherheitsfrage??? eines Anfängers

Beitrag lesen

Moin!

glech noch ne dumme Frage eines Anfängers hinterher ^^

So dumm ist die gar nicht, immerhin ist sie logisch weitergedacht. Du hast allerdings was übersehen.

if ($benutzereingabe=="hallo") {
  irgendwas;
  }

wenn jetzt benutzereingabe folgendes ist?
1==1||blabla

Alles, was in Variablen steht, sind Daten. Daten sind kein Programmcode, können also auch nicht ausgeführt werden.

Warum SQL-Injection dann geht? Die Daten, die man da reintut, sind doch auch nur Variablen.

Stimmt, aber bei SQL hat man zwei Ebenen: Erstens die PHP-Ebene, in der man einen Query-String zusammensetzt. Der ist für PHP noch komplett ungefährlich. Zweitens aber die SQL-Ebene. Der zusammengesetzte String wird _interpretiert_ und _ausgeführt_. Ganz genau so, wie eine Textdatei auf dem Server auch erstmal ungefährlich ist, aber wenn PHP diese Datei einliest und als PHP-Skript interpretiert und ausführt, wird das auch gefährlich.

Der entscheidende Faktor ist daher immer: Wird das, was ich habe, als Daten betrachtet (das ist ungefährlich), oder als Programmanweisung (das ist gefährlich). Wenn es als Programmanweisung betrachtet wird, muß man Vorkehrungen treffen, dass nur genau die Befehle ausgeführt werden, die man selbst wünscht, und keinerlei anderen.

Auch in PHP ist das Ausführen von Code, der in Strings steht, möglich (und gefährlich!): http://www.php.net/eval. Würdest du eval() nutzen, um einen String zusammenzusetzen, der deine oben genannte IF-Bedingung enthält, wäre das böse:

$evalstring = "if ($benutzereingabe=='hallo') {irgendwas();}"  
echo $evalstring; // ungefährlich  
//eval ($evalstring); // extrem gefährlich!  

Weil der Inhalt von $benutzereingabe in den String integriert wird (mit echo ausgeben lassen), würde auch deine "Zusatzbedingung" als Code in den String geschrieben und ausgeführt.

- Sven Rautenberg

--
"Love your nation - respect the others."