MySQL-injection-Schutz und Gefährdung Schilder mit PHP
Was sind die besten Möglichkeiten zum Schutz von MySQL-injection? Welche Schwachstellen sollte ich achten?
Ich weiß, was es ist, aber ich habe wirklich keine Ahnung, wie verletzlich ich sein könnte. Obwohl ich genommen habe (was ich denke) Schritte zum Schutz von mir und meiner Datenbank.
Gibt es eine sure-fire Weise zu stoppen jemand?
BTW...ich Schreibe in PHP:)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie vorbereitete Anweisungen anstelle von mischen die Erklärung und den eigentlichen Nutzdaten.
sehen
Könnten Sie auch interessieren http://shiflett.org/articles/sql-injection und http://shiflett.org/blog/2007/sep/the-unexpected-sql-injection
Vertrauen niemand!
Desinfizieren alle input --
filter_var()
oder regexes oderin_array()
Gültiger Werte oder eine gemischte Strategie, je nach Datentyp."Input" bedeutet, dass jeder Eingabequelle, die Sie nicht direkt kontrollieren können-nicht nur Formen!
Desinfizieren Sie alles, was Sie wieder von
$_GET
,$_POST
,$_SESSION
,$_COOKIE
- alles, hätte jede Möglichkeit des seins verdorben.UND
Verwenden Sie vorbereitete Anweisungen
Müssen Sie bereinigen alle Eingaben.
Wie Sie dies tun können, hängt von der Programmierung languaguage und/oder framework, mit dem Sie arbeiten.
edit:
Wenn Sie mit php die Funktion, die Sie suchen, ist mysql_real_escape_string($string). Sie sollten verwenden, die auf alles erhalten Sie von dem client, der sollte sich in der Datenbank.
Wenn Sie nicht mit einem framework, das Sie mit Desinfektions-tools, PHP hat einen eingebauten string-Flüchtling, sollten Sie es starten. Sie finden die Dokumentation auf, dass in der PHP-Dokumentation für mysql-real-escape-string. Wenn man sich beispielsweise drei erhalten Sie einen guten Eindruck von den Grundlagen, die Sie Folgen können.
Andere Methode, die ich Folgen, um sicherzustellen, dass ich warf Variablen gegebenenfalls. Zum Beispiel, wenn ich erwarte, dass Eingaben von einem Benutzer zu einem integer-werde ich Folgendes tun:
Auch wenn eine Spalte soll begrenzt werden, um ein oder zwei Werte (zum Beispiel eine Spalte Geschlecht) stellen Sie sicher, dass Sie erzwingen, dass in Ihrem PHP-bevor es in die Datenbank.
Kann dies scheint wie gesunder Menschenverstand, aber ich war stolperte auf Sie für eine Weile.
Gibt es einen Unterschied zwischen Codierung
htmlentities()
und Fluchtmysql_real_escape_string()
. Ich dachte, diese als ziemlich austauschbar. Allerdings gibt es die nicht... als gesunder Menschenverstand wird Ihnen sagen. 🙂 Normalerweise ist es am besten Sie beide, wie zuerst codiert, dann die Flucht.Dann, wenn das ziehen der Daten aus den Prozess umkehren, unescape(wenn nötig) dann unencode. Beachten Sie, dass Sie individuell in der Weise in der die Schritte ausgeführt werden (und Umgekehrt) sparen eine Menge Kopfschmerzen und doppeltes escaping leiden.
Ein Zeichen, dass Sie könnten ein problem haben, nehmen Benutzereingaben direkt und legen Sie Sie in Ihre SQL-Befehl.
Beispielsweise Fragen Sie für Ihren Benutzernamen. Wenn Sie es nehmen und dann einfach sagen
"Select * From Users Where Username = '$USERNAME';"
Könnte der Benutzer dann fügen Sie "JOE'; Drop Table..." und so weiter.
In perl können Sie etwas sagen wie
Die execute-Methode sähe dann für Angriffe wie die oben, und Flucht es richtig zu stellen.
Ich diese PHP-Funktion, die auf alle Eingaben, bevor ich versuche, es zu benutzen in jedem code (MySQL-Abfrage, display, etc.). Es ist wahrscheinlich nicht vollständig, aber es sollten halt alle grundlegenden versuche der hacking-system: