Quelle (in Englisch): Anthony Ferrara, developer.joomla.org
Übersetzung: Joomla! Schweiz
Neulich wurde in diversen Drittentwicklungen bemerkt, dass die Art und Weise den Code vor SQL-Injection zu schützen, ganz oder zum Teil unzulänglich ist, respetktive dass die Möglichkeiten die die neue Joomla-API diesbezüglich bietet nicht voll ausgenutzt wird, und so zum Teil immer noch ein kleines Restrisiko bestehen bleibt.
Um es vorweg zu nehmen, nur alleine die Klasse "JRequest" zu benutzen reicht nicht aus, um den Code und somit auch die gesamte Joomla-Seite zu schützen. Es ist aber gar nicht so schwer, mit ein paar zusätzlichen "Kniffen" auf der sicheren Seite zu sein. Gehen wir sie Schritt für Schritt durch, und machen deren Anwendungsweise mit einfachen Beispielen klar.
Erzwinge den erwarteten Variablen-Typ:
Grundsätzlich gilt: wird ein Interger erwartet, dann soll es gefälligst auch ein Integer sein, und nichts anderes.[1]
[2]
Datum:
Soll ein Datum gespeichert werden, so ist grundsätzlich JDate zu verwenden, das jedesmal ein valides Datum zurückgibt:
$sql = 'UPDATE #__mytable SET `date` = . $db->Quote( $date->toMySQL, false);
Strings immer "escapen":
Jedesmal, wenn Strings von einem User-Input (Formular, URL/URI, Gästebucheintrag, Forum....) übernommen werden sollte, mit dem Backslash die Sonder- und Steuerzeichen folgendermassen "entschärfen" (escapen):
Hier werden gleich zwei Funktionen benutzt: Die eine "entschärft" den String mit Backslashes, die andere setzt den String in Anführungszeichen. Das geht noch kürzer: Wenn man den zweiten, optionalen Parameter der Funktion Quote() weglässt (default = true), wird das intern gleich miterledigt:
DOS (Denial of Service) Attacken vorbeugen:
Wird in der SQL-WHERE Klausel der Operand "LIKE" zum Vergleichen von Teilstrings verwendet, so hat man durch die Verwendung der Wildcards "%" und "_" eine DOS-Schwachstelle. Diese können zusätzlich, wird die getEscaped()-Funktion verwendet, mit dem optionalen zweiten Parameter "true" (default ist false) zusätzlich auch noch "escaped" werden:
Schutz vor XSS-Attacken:
Wie schon eingangs erwähnt, der meist (leider) übliche Weg um REQUEST-Variablen zu übernehmen ist die Verwendung von JRequest::getVar(). Aber da existieren einige Methoden mehr, die die entsprechenden Variablen "auslesen" und gleichzeitig auch als Filterfunktion dienen:
Für Ganzzahlen (Integer):
Für Dezimal- Fliesskommazahlen (floats):
Für "Boolsche" Werte (true/false):
Für "Worte": erlaubt sind nur Buchstaben und Unterstrich "_")
Für "Komandos" (erlaubt sind Buchstaben, Zahlen, "." "_" und "_"):
Für "Nicht HTML-Text" (alle HTML-Tags werden entfernt):
Anmerkungen Joomla! Schweiz:
[1]
Eine Zahl wird beispielsweise automatsch zum String, wird sie per Post-Methode "verschickt" oder per Get-Methode übergeben. Wird bei der Übergabe dann deshalb auch ein String akzeptiert, kann das fatale Folgen haben, da REQUEST-Variablen (POST, GET, COOKIE, FILES SESSION) leicht zu manipulieren sind....
[2]
Auf diese Art sind folgende Umwandlungen/Typenerzwingung möglich:
- (int), (integer) - nach integer
- (bool), (boolean) - nach boolean
- (float), (double), (real) - nach float
- (string) - nach string
- (array) - nach array
- (object) - Wandlung zum Objekt



0 Kommentare