Dokumentation der Sicherheitsklasse (class.security.php)
Verfasst: Do 4. Sep 2008, 14:03
Dokumentation der Sicherheitsklasse (class.security.php)
Stand: 4. September 2008
Autor: Frederic Schneider
Sicherheit in Webanwendungen: Warum eine Sicherheitsklasse?
Contenido ist ein komplexes und in den Jahren gereiftes System, das jedoch verschiedene, potentielle Angriffsziele kennt. Daher fiel die Entscheidung, eine globale Sicherheitsklasse zu entwerfen, die Methoden zur Verfügung stellt, die kritischen Punkte aus dem Weg zu räumen. Die Sicherheitsklasse geht dabei auf Cross-Site Scripting (XSS), Remote File Inclusion (RFI) und SQL-Injections ein.
Sicherheit durch ständige Präsenz in den Skripten
Durch manipuliertes Aufrufen durch Internetadressen von Contenido war es bislang bei bestimmten Serverkonfigurationen möglich, schädlichen Quelltext auszuführen und so für akute Sicherheitsprobleme zu sorgen. Diesen Gefahren wurde durch eine breite Kontrolle aller Variablen entgegen getreten. Außerdem wurde der Einzelaufruf von allen Dateien, die nicht eindeutige Einstiegsseiten sind, verhindert. Da jede der Hunderte Dateien einzeln auf etwaige Sicherheitslücken überprüft und ein Aufruf von Standardmethoden der Sicherheitsklasse eingebaut wurden, entstand so eine ständige Präsenz in den Skripten, sodass derartige Lücken der Vergangenheit angehören.
Manipulierung von Datenbanken gehören der Vergangenheit an
Ein großes, in Webanwendungen allgegenwärtiges Problem sind die so genannten SQL-Injections. Ebenfalls durch die Manipulierung von via Internetadressen übergebenen Variablen ist es unter gewissen Umständen möglich, Inhalte aus Datenbanken zu löschen oder etwa durch geschickte Datenbankabfragen Zugriff in die CMS-Verwaltung zu erhalten. Durch das "Escapen" werden solche Risiken grundsätzlich unterbunden.
Anwendung der Sicherheitsklasse
Um das manuelle Aufrufen von Einzelseiten, die keine Einstiegsseiten sind, zu verhindern, wird auf eindeutigen Einstiegsseiten eine Konstante namens "CMS_FRAMEWORK" mit dem Wert "true" gesetzt. Danach wird die Sicherheitsklasse inkludiert und mittels Contenido_Security::checkRequests(); Standard-Methoden aufgerufen.
In jeder Einzeldatei ist nun nur noch zu überprüfen, ob die Konstante gesetzt wurde. Dazu sind folgende drei Zeilen an den Anfang der jeweiligen Datei zu setzen:
Bei jeder Datenbankabfrage kommt zudem die Sicherheitsklasse in Einsatz. Dabei wird jede Variable mit der Funktion escapeDB() oder toInteger() "behandelt".
toInteger() findet ihren Einsatz, sobald die Variable eindeutig ein Integer, also eine Zahl ist.
Beispiel:
Handelt es sich um keine Zahl, wird die Funktion escapeDB() eingesetzt, wobei ihr als zweiter Wert die initialisierte Datenbankklasse als Variable (i. d. R. $db, $db2 oder $db3) übergeben wird.
Beispiel:
Gesetzt den Fall, es wurde keine Datenbank-Klasse initialisiert, kann statt $db auch "null" übergeben werden. Dies ist im Grundsatz aber nicht zu empfehlen.
Es ist bei escapeDB() vor allem darauf zu achten, dass eine Variable nicht zweimal mit escapeDB() "behandelt" wird. Dies könnte zu einem Fehlverhalten führen und passiert meist dann, wenn eine Datenbankabfrage in mehreren Schritten zusammen gebaut wird. Hier könnte die Variable einmal "behandelt" werden, wenn die Abfrage gebaut wird – und einmal die zusammengebaute Abfrage, wenn sie ausgeführt ist.
Die Sicherheitsklasse kennt im Übrigen folgende weitere Standard-Methoden:
Stand: 4. September 2008
Autor: Frederic Schneider
Sicherheit in Webanwendungen: Warum eine Sicherheitsklasse?
Contenido ist ein komplexes und in den Jahren gereiftes System, das jedoch verschiedene, potentielle Angriffsziele kennt. Daher fiel die Entscheidung, eine globale Sicherheitsklasse zu entwerfen, die Methoden zur Verfügung stellt, die kritischen Punkte aus dem Weg zu räumen. Die Sicherheitsklasse geht dabei auf Cross-Site Scripting (XSS), Remote File Inclusion (RFI) und SQL-Injections ein.
Sicherheit durch ständige Präsenz in den Skripten
Durch manipuliertes Aufrufen durch Internetadressen von Contenido war es bislang bei bestimmten Serverkonfigurationen möglich, schädlichen Quelltext auszuführen und so für akute Sicherheitsprobleme zu sorgen. Diesen Gefahren wurde durch eine breite Kontrolle aller Variablen entgegen getreten. Außerdem wurde der Einzelaufruf von allen Dateien, die nicht eindeutige Einstiegsseiten sind, verhindert. Da jede der Hunderte Dateien einzeln auf etwaige Sicherheitslücken überprüft und ein Aufruf von Standardmethoden der Sicherheitsklasse eingebaut wurden, entstand so eine ständige Präsenz in den Skripten, sodass derartige Lücken der Vergangenheit angehören.
Manipulierung von Datenbanken gehören der Vergangenheit an
Ein großes, in Webanwendungen allgegenwärtiges Problem sind die so genannten SQL-Injections. Ebenfalls durch die Manipulierung von via Internetadressen übergebenen Variablen ist es unter gewissen Umständen möglich, Inhalte aus Datenbanken zu löschen oder etwa durch geschickte Datenbankabfragen Zugriff in die CMS-Verwaltung zu erhalten. Durch das "Escapen" werden solche Risiken grundsätzlich unterbunden.
Anwendung der Sicherheitsklasse
Um das manuelle Aufrufen von Einzelseiten, die keine Einstiegsseiten sind, zu verhindern, wird auf eindeutigen Einstiegsseiten eine Konstante namens "CMS_FRAMEWORK" mit dem Wert "true" gesetzt. Danach wird die Sicherheitsklasse inkludiert und mittels Contenido_Security::checkRequests(); Standard-Methoden aufgerufen.
In jeder Einzeldatei ist nun nur noch zu überprüfen, ob die Konstante gesetzt wurde. Dazu sind folgende drei Zeilen an den Anfang der jeweiligen Datei zu setzen:
Code: Alles auswählen
if(!defined('CON_FRAMEWORK')) {
die('Illegal call');
}
toInteger() findet ihren Einsatz, sobald die Variable eindeutig ein Integer, also eine Zahl ist.
Beispiel:
Code: Alles auswählen
$query = "SELECT * FROM con_art_lang WHERE idart = '" . Contenido_Security::toInteger($_GET['idart']) . "'";
Beispiel:
Code: Alles auswählen
$db = new DB_Contenido;
$query = "SELECT * FROM con_art_lang WHERE title = '" . Contenido_Security::escapeDB($title, $db) . "'";
$db->query($query);
Es ist bei escapeDB() vor allem darauf zu achten, dass eine Variable nicht zweimal mit escapeDB() "behandelt" wird. Dies könnte zu einem Fehlverhalten führen und passiert meist dann, wenn eine Datenbankabfrage in mehreren Schritten zusammen gebaut wird. Hier könnte die Variable einmal "behandelt" werden, wenn die Abfrage gebaut wird – und einmal die zusammengebaute Abfrage, wenn sie ausgeführt ist.
Die Sicherheitsklasse kennt im Übrigen folgende weitere Standard-Methoden:
- checkSession() – überprüft, ob die übergebene Session-Variable dem Format entspricht; diese Überprüfung wird automatisch via des Aufrufes von checkRequests() in den Einstiegsseiten vorgenommen
- isBoolean() – überprüft, ob die übergebende Variable ein Boolean-Typ ist und gibt im negativen Falle ein "false" zurück
- isInteger() – überprüft, ob die übergebende Variable ein Integer-Typ, also eine Zahl ist und gibt im negativen Falle ein "false" zurück
- isString() – überprüft, ob die übergebende Variable ein String-Typ, also ein Text ist und gibt im negativen Falle ein "false" zurück
- toBoolean() – wandelt eine Variable in den Boolean-Typ um
- toInteger() – wandelt eine Variable in den Integer-Typ, also in eine Zahl um
- toString() – wandelt eine Variable in den String-Typ, also in einen Text um, wobei die Möglichkeit besteht, bestimmte HTML-Tags zu verbieten, indem nur die erlaubten angegeben sind; es ist daher als zweiten Wert ein "true" und als dritten die erlaubten Tags zu übergeben
Code: Alles auswählen
$string = Contenido_Security::toString($variable, true, '<strong><em><u>');