heute wurde ich durch 1und1 auf folgendes aufmerksam gemacht:
--------->8-------------
PHP-Workshop: PHP-Seiten absichern
von Stephan Schmidt
Wenn Sie eine Website im Internet publizieren, die durch Verwendung einer Skriptsprache wie PHP Interaktion mit dem Benutzer ermöglicht, so ist diese Webseite für jedermann erreichbar. Sie müssen also auch damit rechnen, dass es Benutzer geben kann, die Schwachstellen in Ihrer Webseite aufspüren und ausnutzen möchten. In dieser Ausgabe des PHP-Workshops finden Sie Tipps, wie Sie häufige Schwachstellen ausmerzen können.
SQL-Injection
Viele PHP-Webseiten stellen Inhalte in HTML-Seiten dar, die zuvor in einer Datenbank, wie z.B. MySQL gespeichert werden. Sollten Sie diese Technik auch in Ihrer Webseite verwenden, und in Ihren Datenbankabfragen Parameter aus der URL übernehmen, so sollten Sie sich gegen die sogenannte SQL-Injection schützen.
Angenommen, Sie verwenden PHP-Code in Ihrer Seite, der dem folgenden ähnelt:
Code: Select all
$query = "SELECT * FROM artikel WHERE id=".$_GET['id'];
$result = mysql_query($query);
Code: Select all
http://www.beispiel.de/artikel.php?id=1;DELETE%20FROM%20artikel
Code: Select all
$query = "SELECT * FROM artikel WHERE id=".(integer)$_GET['id'];
$result = mysql_query($query);
Cross-Site-Scripting
Unter dem Begriff "Cross-Site-Scripting" versteht man das Einschleusen von Javascript-Code in Web-Anwendungen. Damit kann der Angreifer z.B. Cookies der Besucher auslesen. Vor Cross-Site-Scripting müssen Sie sich schützen, wenn Sie Daten, die ein Benutzer an Ihre Anwendung schickt und Sie diese später den anderen Besuchern Ihrer Seite anzeigen, wie es z.B. bei einem Gästebuch der Fall ist.
Ein solches Gästebuch besteht in der Regel aus zwei Dateien, eine Datei nimmt neue Einträge entgegen und speichert diese z.B. in der Datenbank:
Code: Select all
$name = $_POST['name'];
$kommentar = $_POST['kommentar'];
$query = "INSERT INTO gaestebuch SET name='$name', kommentar='$kommentar'";
$mysql_query($query);
Code: Select all
$query = "SELECT * gaestebuch LIMIT 0,10";
$result = $mysql_query($query);
while ($eintrag = mysql_fetch_assoc($result)) {
printf ("<b>%s</b><br />", $eintrag['name']);
printf ("<p>%s</p>", $eintrag['kommentar']);
}
Code: Select all
<script type="text/javascript">alert('Seite ist unsicher!');</script>
Code: Select all
$name = strip_tags($_POST['name']);
$kommentar = strip_tags($_POST['kommentar']);
$query = "INSERT INTO gaestebuch SET name='$name', kommentar='$kommentar'";
$mysql_query($query);
Eine zweite Möglichkeit ist, die Daten bei der Ausgabe dementsprechend anzupassen, dass der Javascript-Code nicht vom Browser ausgeführt sondern angezeigt wird. Dazu müssen ja nur die HTML-Tags <script> und </script> Tags durch <script> und </script> ersetzt werden. < und > sind die so genannten HTML-Entitäten für das Kleiner- und Größer-Zeichen, die in HTML ja eine Sonderstellung einnehmen, da sie den Anfang und das Ende eines Tags begrenzen.
Die PHP-Funktion htmlentities() kann verwendet werden, um alle Zeichen, die in HTML eine Steuerfunktion haben, durch die entsprechenden Entitäten zu ersetzen, so dass diese im Browser ganz normal angezeigt werden. Sie müssen also nur das Skript, dass alle Einträge ausgibt, leicht anpassen:
Code: Select all
$query = "SELECT * gaestebuch LIMIT 0,10";
$result = $mysql_query($query);
while ($eintrag = mysql_fetch_assoc($result)) {
printf ("<b>%s</b><br />", htmlentities($eintrag['name']));
printf ("<p>%s</p>", htmlentities($eintrag['kommentar']));
}
Durch die hier erläuterten kleinen Veränderungen an Ihren Skripten können Sie Ihre Website bereits gegen die häufigsten Angriffe schützen. Verwenden Sie auf Ihren Webseiten von 1&1 zur Verfügung gestellte Module, so sind diese natürlich schon gegen diese Attacken geschützt.
* Stephan Schmidt ist Web-Application-Developer bei der 1&1 Internet AG. Weiterhin ist er regelmäßiger Autor des PHP Magazins und auf internationalen Konferenzen zum Thema PHP als Redner vertreten.
--------->8-------------
Für mich stellen sich nun zwei Fragen:
Ist das überhaupt relevant?
Is das in phpWCMS berücksichtigt?
die ich zur Diskussion stellen möchte.