PHP-Einleitung
1) Unterschiede zwischen PHP und C
In PHP werden keine Variablen initialisiert, wenn man eine braucht, benutzt man sie einfach.
Es gibt auch keine Variablentypen, jedenfalls muss sich der Programmierer nicht darum kümmern.
Intern hat natürlich jede Variable ihren Typ, je nachdem, was in ihr steht.
Auch sind Typumwandlungen möglich, aus einer Integer kann man leicht einen String machen.
Beispiele:
$int = 123; //Integer
$str = "123"; //String
$int = (string) $int; //Jetzt ist $int auch ein String
$tstr = $str[0]; //Gib mir den ersten Buchstaben von $str
Siehe auch: http://www.php.net/manual/de/language.variables.php
Funktionen sehen in PHP recht ähnlich aus wie in C, mit dem Unterschied, das sie keinen Rückgabetyp
haben. Warum auch, ist ja egal, was in der Variable steht.
Beispiel:
function machwas($bla)
{
if (is_int($bla)) //Wenn $bla ein Integer ist
$bla++; //erhöhe $bla um 1
return $bla; //Und gib $bla zurück
}
Siehe auch: http://www.php.net/manual/de/functions.php
Es gibt in PHP keine Zeiger. Aber Referenzen.
Die sind in PHP aber etwas anderes als in C.
Eine Referenz ist eine Art Alias für einen Variableninhalt.
Ein Inhalt kann also mehrere Namen haben, die dann gleichberechtigt nebeneinander stehen.
Beispiel:
$var = 1; //$var hat den Wert 1
$var2 = 2; //$var2 hat den Wert 2
$var3 =& $var; //$var3 hat den Wert 1, zeigt auf den gleichen Inhalt wie $var
$var =& $var2; //$var hat den Wert 2, ändert jedoch nichts am vorherigen Inhalt, $var3 bleibt gleich.
echo $var; //Gibt 2 zurück
echo $var2; //Gibt 2 zurück
echo $var3; //Gibt 1 zurück
-----------
$var = 1; //$var hat den Wert 1
refer($var); //Ruft die Funktion refer auf
function refer(&$bla)
{
$bla++; //Erhöht den Wert von $var um eins (weil Referenz)
}
echo $var; //Gibt 2 zurück
Alles anzeigen
Siehe auch: http://www.php.net/manual/de/language.references.php
Nun ja, das eine PHP-Datei mit <?php eingeleitet wird und mit ?> aufhört, weiß man inzwischen, oder?
2) Erste Anfänge
Fangen wir daher mit den interessanten Sachen an:
Ich will ja nicht nur Zeit und Datum ausgeben lassen (das haben wir ja schonmal gemacht), sondern vielleicht auch
auf das reagieren, was der User so macht. Ich will also Daten von "außen" übernehmen.
Jeder kennt HTML-Formulare, hier im Forum sind sie ja überall.
<form action="test.php" method="post"> //Das Formular selber, nach dem Absenden werden die Daten an die Datei test.php gesendet
<input type="text" name="test" value=""> //Ein einzeiliges Eingabefeld mit Namen test
<textarea name="message" rows="20" cols="80"></textarea> //Ein mehrzeiliges Eingabefeld (Textbereich) mit Namen message (rows und cols geben die Größe an)
<input type="input" type="submit" value="Absenden"> //Der Absendebutton
</form>
Wir haben also ein HTML-Formular mit einem Eingabefeld und einem Textbereich, das an unsere Datei test.php gesendet wird und zwar via der POST-Methode.
Es gibt zwei Methoden, Daten an PHP zu übertragen, POST und GET. Bei GET sind die Variablen in der URL zu sehen, siehe Forum, das nach dem ? sind Variablen.
POST wird "unsichtbar" gesendet.
Für diese beiden Methoden gibt es in PHP sogenannte superglobale Variablen, die überall gültig sind (wie globale Variablen in C, mit dem Unterschied, das superglobale
Variablen auch in anderen Klassen gelten).
Für unseren Fall benötigen wir die superglobale Variable $_POST.
Geben wir also die Eingaben des Users aus:
<?php
echo "Sie haben in das Eingabefeld folgendes eingegeben: ";
echo $_POST["test"];
echo "<br>";
echo "Sie haben in das Textfeld folgendes eingegeben: ";
echo $_POST["message"];
?>
Mit GET geht es genauso.
Es gibt auch noch $_COOKIE für Daten, die von einem Cookie übertragen wurden.
$_FILES ist für den Upload von Dateien gedacht.
$_SERVER liefert Daten über die Laufzeitumgebung und anderes, wird durch den Webserver (normalerweise Apache) generiert und ist daher recht vertrauenswürdig.
In $_SERVER['REMOTE_ADDR'] steht z.B. die IP-Adresse des Hosts, der die Seite gerade aufgerufen hat.
$_SESSION speichert Sessiondaten, doch dazu später mehr.
Es gibt noch andere superglobale Variablen, die aber nicht so wichtig sind.
Siehe auch: http://www.php.net/manual/de/lang….predefined.php
3) Sicherheit in PHP
PHP ist unsicher.
Daher ist oberstes Gebot: Traue niemandem. Validiere allen Input oder stirb.
Wer das nicht macht kann sich gleich einsargen lassen und sollte niemals ernsthaft PHP coden!
3.1) Globals
Es gibt in PHP die Möglichkeit, das fremde Variablen (eben die von außen) automatisch erstellt werden und dann eben nicht
mit $_POST angesprochen werden müssen. Wenn Globals ON sind (was sie bei neueren PHP-Versionen nicht sein sollten!) hast du
schon deine erste Sicherheitslücke. Denn dann kann JEDE Variable, die nicht initialisiert wird, manipuliert werden!
z.B:
Da $login nicht vorher initialisiert wird, kann jetzt ein Angreifer einfach die Datei so aufrufen:
login.php?login=true
Und schon ist er drin, ohne das er das Passwort kannte!
Der obige Code ist also Schrott!
Wie gehts richtig?
Jede Variable sollte vorher mit einem Startwert versehen werden, bzw. irgendwie initialisiert.
Ein Array kann z.B. mit $var = array(); erstellt werden.
Auch wenn Globals OFF sind, sollte man so verfahren. Es ist einfach besser und sicherer.
3.2) Prüfe jede Variable die von außen kommt!
Warum? Ganz einfach, wenn du eine Integer erwartest, es kommt aber ein String, kann das sehr leicht
zu seltsamen Reaktionen führen. Besonders wenn du mit SQL und Datenbanken arbeitest, ist es unvermeidlich,
das du alles gegencheckst, was du verarbeitest.
Dazu gibt es einige Funktionen, die findest du unter: http://www.php.net/manual/de/ref.variables.php
Wenn du eine Integer erwartest, dann prüfe mit is_int() obs auch eine ist.
Und wenn du eine Integer aus einem gewissen Bereich erwartest, so prüfe das ebenfalls!
if ($int >= 0 && $int <=10) Prüft, ob $int zwischen 0 und 10 liegt.
Prüfe oder stirb.
3.3) SQL-Injection
Auch wenn es heute schon einige nette Automatismen gibt, die da für einige Sicherheit sorgen, so muss man immer
auch selber für Sicherheit sorgen, denn es kann niemand sagen, wo die eigenen Skripte mal laufen werden. Nicht
überall ist sowas wie MagicQuotes aktiviert.
Was ist eine SQL-Injection eigentlich?
Recht einfach, durch SQL-Injection werden fremde SQL-Anweisungen von außen in die DB geschleust. Nichts, was man
wirklich will, denn wer sowas tut, macht es meist aus unfreundlichen Gründen!
Beispiel:
$id = $_POST['id'];
$query = "SELECT id, name FROM products WHERE id = $id;";
$result = mysql_query($query);
Wenn jetzt jemand $_POST['id'] manipulieren kann, dann schreibt er dort z.B. folgendes hinein:
0;
UPDATE user SET Password='crack' WHERE user='admin';
FLUSH PRIVILEGES;
So das die Abfrage wie folgend aussehen würde:
$query = "SELECT id, name FROM products WHERE id = 0; UPDATE user SET Password='crack' WHERE user='admin';";
Es werden also zwei Abfragen ausgeführt, einmal die, die man haben will und dann die, die man nicht haben will.
Denn jetzt hat der Angreifer Zugriff auf den Admin-Account und man selber ist ausgesperrt!
Nun, wie verhindert man das?
Recht simpel, man muss alle Zeichen, mit denen ein Angriff erfolgen kann escapen.
Dazu gibt es eine Funktion namens mysql_escape_string() für MySQL (siehe http://www.php.net/manual/de/func…cape-string.php)
oder auch eine Standardfunktion namens addslashes(), die dies erledigen.
Wenn man sich so absichert und zusätzlich jede Variable prüft, ob da auch das drin ist, was drin sein soll, ist man ein gutes Stück weiter auf dem
Weg zum sicheren Script.
Das soll jetzt erstmal reichen.
Wenns Fragen gibt, so stellt sie bitte.
Interessante Links:
http://www.php-faq.de/
http://www.php.net/manual/de/