Zum Thema Sicherheit gibt es (auch in anderen Sprachen) Grundsätze wie zB "Traue nie den Benutzereingaben".
Das mMn wichtigste:
Butzereingaben:
Via PHP bekommst Du über die URL ($_GET) Daten.
Eine URL "domain.com?key=1" ergibt in PHP:
Schlüssel $_GET ['key']
Wert 1
Ähnlich bei $_POST: ein Formular wird über method="POST" abgesendet
zB
<input type="text" name="key" value="" /> <!-- angenommen der nutzer trägt 1 in das textfeld ein -->
in PHP bekommst Du nun
Schlüssel $_POST ['key']
Wert 1
Diesen Daten darfst Du nun nicht trauen.
Wenn Du zB $_GET['page'] zum einbinden einer Datei nutzt
kann der Nutzer alles ihm mögliche "versuchen". Gibt er zB "meine-datei.xy" in die URL ein, dann würde Dein Script versuchen diese Datei einzubinden.
Eine Lösung des Problems ist eine Whitelist.
Das kann zB ein Array sein:
$pages = array(
'home' => 'usw'
'member' => 'usw'
);
// prüfen, ob angeforderte seite erlaubt ist:
// wir sehen nach, ob im array $pages die ebene mit dem schlüssel $_GET['page'] existiert:
if( isset($pages[$_GET['page']]) )
{
// ja, ist erlaubt
}
Ausgeben von Nutzereingaben:
Angenommen Du erwartest über ein Formular via POST einen Benutzernamen ( $_POST['name'] ).
Weil der Benutzer aber ein Schlechter Mensch ist, versucht er XSS (cross site scripting) -
er versucht Javascript Code auf Deiner Seite auszugeben.
Er gibt also keinen Namen ein, sondern Javascript Code:
<script>alert('test')</script>
Somit steckt nun in
$_POST['name']
der Wert
<script>alert('test')</script>
Wenn Du diesen Wert jetzt unbehandelt auf Deiner Seite ausgibst:
Dein Name ist: <?php $_POST['name']; ?>
dann steht im Quellcode (der Code den der browser umsetzt)
Dein Name ist: <script>alert('test')</script>
Der Browser zeigt also den Text Dein Name ist: an,
und führt den Javascript Code alert('test') aus.
Um das zu verhindern solltest Du die Ausgabe maskieren/umwandeln:
(Auch wenn Du diese Benutzereingabe gespeichert hast, wieder lädst und ausgibst)
Dein Name ist: <?php htmlspecialchars($_POST['name']); ?>
(siehe php.net http://php.net/manual/de/function.htmlspecialchars.php )
Im Browser steht nun:
Zitat
Dein Name ist: <script>alert('test')</script>
Aber im Quellcode:
Dein Name ist: <script>alert('test')</script>
Wie Du siehst, wurde zB das Zeichen < zu < umgewandelt.
Der Browser bekommt also keine Javascriptanweisung, sondern formatierte Zeichen die er "einfach nur" anzeigen soll.
Übrigens siehst Du sowas hier im Forum ständig. Wenn ich hier im Text Javascript einfüge:
<script>alert('test')</script>
dann behandelt das das Forum als Benutzereingabe und maskiert die Eingaben auf diese o.ä. Weise.
Wäre das nicht der Fall, dann würde Dir Dein Browser eine Alertbox mit dem Text "test" anzeigen.