Um ehrlich zu sein, denke ich, dass der Autor dieser Funktionen entweder keine Ahnung hat, was XSS- und SQL-Injections sind oder was genau die verwendeten Funktionen tun.
Um nur zwei Merkwürdigkeiten zu nennen:
- Mit
stripslashes
nachmysql_real_escape_string
entfernt die Schrägstriche, die vonmysql_real_escape_string
hinzugefügt wurden . htmlentities
ersetzt den Chatacter<
und>
die instrip_tags
verwendet werden um Tags zu identifizieren.
Außerdem:Generell sind Funktionen, die vor XSS schützen, nicht geeignet, um vor SQL-Injections zu schützen und umgekehrt. Weil jede Sprache und jeder Kontext ihre eigenen Sonderzeichen hat, die es zu beachten gilt.
Mein Rat ist, zu lernen, warum und wie Code-Injection möglich ist und wie man sich dagegen schützt. Lernen Sie die Sprachen, mit denen Sie arbeiten, insbesondere die Sonderzeichen und wie Sie diesen entgehen können.
Bearbeiten Hier ist ein (wahrscheinlich seltsames) Beispiel:Stellen Sie sich vor, Sie erlauben Ihren Benutzern, einen Wert einzugeben, der als Pfadsegment in einem URI verwendet werden soll, den Sie in einem JavaScript-Code in einem onclick
verwenden Attributwert. Der Sprachkontext sieht also so aus:
- HTML-Attributwert
- JavaScript-String
- URI-Pfadsegment
- JavaScript-String
Und um es lustiger zu machen:Sie speichern diesen Eingabewert in einer Datenbank.
Um diesen Eingabewert nun korrekt in Ihrer Datenbank zu speichern, müssen Sie nur noch eine geeignete Kodierung für den Kontext verwenden, in dem Sie diesen Wert in Ihre Datenbanksprache (z. B. SQL) einfügen möchten. der Rest ist (noch) egal. Da Sie es in eine SQL-String-Deklaration einfügen möchten, sind die kontextabhängigen Sonderzeichen die Zeichen, mit denen Sie diesen Kontext ändern können. Wie bei String-Deklarationen sind diese Zeichen (insbesondere) der "
, '
, und \
Zeichen, die maskiert werden müssen. Aber wie bereits erwähnt, erledigen vorbereitete Anweisungen all diese Arbeit für Sie, also verwenden Sie sie.
Jetzt, da Sie den Wert in Ihrer Datenbank haben, wollen wir ihn richtig ausgeben. Hier gehen wir vom innersten zum äußersten Kontext vor und wenden in jedem Kontext die richtige Kodierung an:
- Für das URI-Pfadsegment Kontext müssen wir (mindestens) all jenen Zeichen entkommen, die uns diesen Kontext ändern lassen; in diesem Fall
/
(aktuelles Pfadsegment verlassen),?
, und#
(beide verlassen den URI-Pfadkontext). Wir könnenrawurlencode
verwenden dafür. - Für die JavaScript-Zeichenfolge Kontext müssen wir uns um
"
kümmern ,'
, und\
. Wir könnenjson_encode
verwenden hierfür (sofern vorhanden). - Für den HTML-Attributwert wir müssen uns um
&
kümmern ,"
,'
, und<
. Wir könnenhtmlspecialchars
verwenden dafür.
Jetzt alles zusammen:
'… onclick="'.htmlspecialchars('window.open("http://example.com/'.json_encode(rawurlencode($row['user-input'])).'")').'" …'
Wenn nun $row['user-input']
ist "bar/baz"
die Ausgabe ist:
… onclick="window.open("http://example.com/"%22bar%2Fbaz%22"")" …
Aber die Verwendung all dieser Funktionen in diesen Kontexten ist kein Overkill. Denn obwohl die Kontexte ähnliche Sonderzeichen haben können, haben sie unterschiedliche Escape-Sequenzen. URI hat die sogenannte Prozentcodierung, JavaScript hat Escape-Sequenzen wie \"
und HTML hat Zeichenreferenzen wie "
. Und wenn Sie nicht nur eine dieser Funktionen verwenden, wird der Kontext unterbrochen.