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

Base64 als Methode zur Bereinigung von Benutzereingaben für Mysql

Nicht desinfizieren Eingabe als Mittel zur Verhinderung von SQL-Injection - Platzhalter verwenden (oder richtiges Entkommen) , stets. Sei konsequent. Sicher sein. Das Problem ist bereits gelöst.

Dieser Fall ist aufgrund der eingeschränkten Domain "sicher". des base64_encode Funktion. Allerdings..

Es ist schlechte Praxis und das Speichern von base64-codierten Werten (so dass die gezeigte Abfrage funktionieren kann) enthält mehrere Negative Auswirkungen, wenn es sich ändert die gespeicherte Information:sie zerstört Die Reihenfolge der Werte macht die Informationen nicht trivial durchsuchbar , erfordert eine zusätzliche "encode/decode"-Schritt und sogar verbraucht mehr Platz - Autsch!

Obwohl es bestimmte Fälle für die base64-Codierung von Daten geben kann, ist dieser Ansatz nicht gut geeignet, um SQL-Injection abzuschwächen .

Das Problem entsteht durch den Zugriff auf SQL über ein Textprotokoll wo der Abfragebefehl/Form und Werte sind vermischt. Die Verwendung von richtig Escape-Techniken (z. B. mysql_real_escape_string ). ) behebt dies, indem sichergestellt wird, dass die Informationen maskiert werden, sodass der SQL-Text geparst wird wie beabsichtigt - jedoch im Gegensatz zu einem base64-Codierungsschritt nicht tatsächlich die gelieferten Informationen ändern!

Dieser ist genau was Platzhalter bieten ! Platzhalter sind die allgemein korrekter Ansatz und sollte gefördert werden. Platzhalter ermöglichen das Senden der Abfrage und der Werte in die Datenbank separat wenn von der Bibliothek/Datenbank unterstützt; und werden ansonsten durch Escapezeichen emuliert. Korrekte Verwendung von Platzhaltern eliminiert SQL Injection und die Notwendigkeit von Benutzercode, um Werte in SQL-Befehlstext einzumischen, was auch das Schreiben und Verwalten von Abfragen erleichtern kann.

Um zu verhindern, dass "einzelne Programmierer" schreckliche Abfragen schreiben, ist die Lösung, verhindern Ad-hoc-Abfragen werden nicht im Code verstreut:Sammeln Sie die Datenzugriffsvorgänge in einer Datenzugriffsschicht ( DAL) (möglicherweise in Verbindung mit einem ORM) und nur relevante Aktionen verfügbar machen, um die ordnungsgemäße Verwendung von SQL innerhalb der DAL sicherzustellen. In einfacheren Projekten ist die DAL auch ein geeigneter Ort, um die Geschäftsregeln für Hygiene und andere Validierungslogiken zentral zu verwalten.

Genauer:

  • Desinfizieren Werte für Geschäftsregeln; Dies sollte "schlechte Informationen" verhindern, wie z. B. ein Benutzername, der zu kurz ist, eingeschränkte Zeichen enthält oder anderweitig nicht den geschäftlichen Anforderungen entspricht.

  • Platzhalter verwenden um SQL-Injection zu verhindern . Dies ist streng bezieht sich auf die Übertragung der Daten an SQL und hat keinen Einfluss auf die darin enthaltenen Informationen.

Während MySQL 5.6.1 FROM_BASE64 , sodass die Codierung einfach im SQL-Befehlstext verwendet werden könnte, fügt dies dennoch einen zusätzlichen expliziten Decodierungsschritt hinzu und verkompliziert die Abfrage, wenn ein solches Codierungsschema verwendet wird. Dieser base64-Ansatz ist einfach nicht notwendig, da es bereits erprobte Techniken gibt, um SQL-Injection zu verhindern, und wurde in der Ausgangsfrage nicht vorgeschlagen.