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

SQL-Injection-Schutz nur mit str_replace

Dieses isolierte Beispiel ist für Injektionen unverwundbar.

Aber Sie müssen sich darüber im Klaren sein, dass der Schutz vor SQL-Injection nicht nur eine Zeichenersetzung ist . Und die Umstände können sich von denen unterscheiden, die Sie im Moment für selbstverständlich halten. Ihr Code würde also aufgrund von wesentlichen Nachteilen dieser Methode auf lange Sicht anfällig werden :

  • Zeichen ersetzen ist nur ein Teil der erforderlichen Formatierung
  • Dieser spezielle Ersatz kann nur auf Saiten angewendet werden, wobei andere Teile absolut ungeschützt bleiben.
  • Eine solche Ersetzung ist außerhalb einer Abfrageausführung, was bedeutet, dass sie für menschliche Fehler jeglicher Art anfällig ist.
  • Eine solche Ersetzung ist eine im Wesentlichen trennbare Maßnahme, d. h. sie kann zu weit von der eigentlichen Abfrageausführung entfernt und schließlich vergessen werden.
  • diese Art von Escaping ist anfällig für Codierungsangriffe , was die Verwendung der Lösung zu begrenzt macht.

An der Zeichenersetzung an sich ist nichts auszusetzen, aber nur, wenn sie als Teil einer vollständigen Formatierung verwendet wird; angewendet auf den rechten Abfrageteil; und von einem Datenbanktreiber ausgeführt, nicht von einem Programmierer; kurz vor der Hinrichtung.

Funktionen, die Sie in den Kommentaren vorgeschlagen haben, sind ein guter Schritt, aber immer noch unzureichend, da sie Gegenstand der oben aufgeführten Nachteile sind, was sie anfällig für alle möglichen menschlichen Fehler macht.

Und SQL-Injection ist nicht das einzige Problem bei diesem Ansatz, es ist auch ein Usability-Fehler, da diese Funktion entweder Ihre Daten verderben würde, wenn sie als Inkarnation der letzten Zeit verwendet wird magische Anführungszeichen , oder machen Sie Ihren Code aufgebläht, wenn er verwendet wird, um jede Variable direkt im Anwendungscode zu formatieren.

Solche Funktionen können nur zur Verarbeitung eines Platzhalters verwendet werden , aber natürlich nicht durch die Verwendung einer selbstgebauten Ersetzungsfunktion, sondern einer richtigen Funktion, die von der Datenbank-API bereitgestellt wird.