Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Sind diese beiden Funktionen für die Desinfektion zu viel des Guten?

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:

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

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önnen rawurlencode verwenden dafür.
  • Für die JavaScript-Zeichenfolge Kontext müssen wir uns um " kümmern , ' , und \ . Wir können json_encode verwenden hierfür (sofern vorhanden).
  • Für den HTML-Attributwert wir müssen uns um & kümmern , " , ' , und < . Wir können htmlspecialchars 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(&quot;http://example.com/&quot;%22bar%2Fbaz%22&quot;&quot;)" …

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 &quot; . Und wenn Sie nicht nur eine dieser Funktionen verwenden, wird der Kontext unterbrochen.