Website-PHP-Schutz | Support - Tipps und Tricks

Support Tipps & Tricks Website-PHP-Schutz
Wie vermeidet man die größten Sicherheitsrisiken bei der Entwicklung von Webseiten mit PHP?

Kritisch sind Parameter, welche von außen manipulierbar sind und dann vom Server verarbeitet werden und/oder auf der Webseite wieder ausgegeben werden.

Diese Werte können durch Manipulation der URL (GET-Parameter), durch das Senden von Formulardaten (GET- oder POST-Parameter) oder auch über das Manipulieren von Werten in Cookies Einfluss nehmen. Besondere Beachtung bei der Verarbeitung finden müssen also immer:

  • $_GET["Parameter"]
  • $_POST["Parameter"]
  • $_COOKIE["Parameter"]

SQL-Injections
SQL-Injections schleusen ungewollte Strings in diese PHP-Scripte ein und manipulieren damit die Datenbank oder lesen kritische Daten aus.
Beispiel:
<?php
$sql = "SELECT * FROM users WHERE username='".$_POST["username"]."';";
?>


Massnahmen
Um eine SQL-Injection zu verhindern, sollte man die gesendeten Daten (GET, POST, COOKIE), die in einer SQL-Abgfrage verwendet werden, maskieren.

Für MySQL und PHP eignet sich dafür am besten die Funktion mysql_real_escape_string().
Beispiel:
<?php
$sql = "SELECT * FROM users WHERE username='".mysql_real_escape_string($_POST["username"])."';";
?>
PHP Funktion magic_quotes_gpc sollte deaktiviert sein (Off), die Einstellung finden Sie im Hosting Control Panel unter Einstellungen -> httpd-spezial.
Standardmässig ist magic_quotes_gpc deaktivert (Off).


Cross-Site-Scripting
Cross-Site-Scripting erfolgt über dieselben Wege, wie eine SQL-Injection. Es wird jedoch HTML eingeschleust und funktioniert über die Interpretation des Browsers. Am häufigsten werden in die Formularfelder JavaScripts oder iFrames, welche ihrerseite Scripte laden, geschrieben.

Massnahmen
Benutzereingaben escapen, PHP bietet zwei Funktionen um HTML-Quelltext zu escapen.
htmlspecialchars()
und
htmlentities()

Durch htmlentities() werden Zeichen wie < in &lt; umkodiert.

String mit htmlentities() escapen, Beispiel:
<?php
echo htmlentities($_POST["Parameter"]);

echo htmlentities($_GET["Parameter"]);

echo htmlentities($_SERVER["PHP_SELF"]);
?>
Werden die Ausgaben maskiert kann der Benutzer keinen HTML-Code mehr ausgeführt.


htmlentities als PHP Funktion, Beispiel:
<?php
function htmle($str) {
$str = htmlentities($str, ENT_COMPAT, 'UTF-8');
return $str;
}

echo htmle($_GET["Parameter"]);

oder ohne Charset (Zeichenkodierung):

function htmle($str) {
$str = htmlentities($str);
return $str;
}
?>

Ab PHP 5.4 ist UTF-8 Standard.

Weitere Schutzmaßnahmen
Administrator, Admin-Ordner passwortschützen.
Die meisten Admin Bereiche haben einen eigenen Login, der je nach Programmierung mehr oder weniger schützt. Schafft es ein Angreifer jedoch, sich in diesen Admin-Bereich einzuloggen, indem er irgendwie an das Admin-Passwort herankommt, stehen ihm weitreichende Möglichkeiten offen.

Darum ist es besser, den Admin Bereich noch zusätzlich über den servereigenen Verzeichnisschutz abzusichern.
Man muss sich dann leider doppelt einloggen, erreicht aber eine größere Sicherheit.

Ein Passwortschutz können Sie ganz einfach im Hosting Control Panel aktivieren,
unter Einstellungen -> Passwortschutz -> z.B. admin schützen.

Datei-Upload
Haben User die Möglichkeit, Dateien hochzuladen, sollten diese Dateien immer auf ihre Endung bzw. ihre Datei-Art überprüft werden und nur solche zugelassen werden, die auch nötig sind. Bei Galerien z.B. nur JPEGs, GIFs und PNGs.

Diese Kurz-Anleitung erhebt keinen Anspruch auf Vollständigkeit.
Es gibt noch weitere Schutzmassnahmen.