Was sind die besten Möglichkeiten zum Schutz vor MySQL-Injektionen? Auf welche Schwächen sollte ich achten?
Ich weiß, was es ist, aber ich habe wirklich keine Ahnung, wie verletzlich ich sein könnte. Obwohl ich (was ich denke) Schritte unternommen habe, um mich selbst und meine Datenbank zu schützen.
Gibt es einen sicheren Weg, jemanden aufzuhalten?
BTW ... Ich schreibe in PHP:)
Vertraue niemandem!
Bereinigen Sie alle Eingaben - filter_var()
oder regexes oder in_array()
gültige Werte oder eine gemischte Strategie je nach Datentyp.
"Eingabe" bedeutet eine Quelle von Eingaben, die Sie nicht direkt steuern - nicht nur Formulare!
Bereinige alles, was du zurückbekommst von $_GET
, $_POST
, $_SESSION
, $_COOKIE
- alles, was irgendeine Möglichkeit haben könnte, verdorben zu werden.
AND
Verwenden Sie vorbereitete Anweisungen
Sie müssen alle Eingaben bereinigen. Wie Sie dies tun können, hängt von der Programmiersprache und / oder dem Framework ab, mit dem Sie arbeiten.
bearbeiten:
Wenn Sie PHP verwenden, ist die Funktion, nach der Sie suchen, mysql_real_escape_string ($ string). Sie sollten das für alles verwenden, was Sie von dem Client erhalten, der in die Datenbank gehen sollte.
Wenn Sie kein Framework verwenden, das Ihnen Hygienisierungs-Tools zur Verfügung stellt. PHP hat einen eingebauten String-Escaper, sollten Sie dort anfangen. Sie finden die Dokumentation zu diesem in der PHP-Dokumentation für die mysql-Echtzeit-Escape-Zeichenfolge . Wenn Sie Beispiel 3 betrachten, erhalten Sie eine gute Vorstellung von den Grundlagen, denen Sie folgen können.
Eine andere Methode, die ich befolge, ist, sicherzustellen, dass ich Variablen an die richtigen Stellen trage. Wenn ich zum Beispiel erwarte, dass die Eingabe eines Benutzers eine ganze Zahl ist, mache ich Folgendes:
%Vor%Auch wenn eine Spalte auf einen oder zwei Werte beschränkt sein sollte (zum Beispiel eine Geschlechtspalte), vergewissern Sie sich, dass Sie diese in Ihrem PHP erzwingen, bevor Sie sie in die Datenbank einfügen.
Das klingt nach gesundem Menschenverstand, aber ich habe mich eine Zeitlang darüber lustig gemacht.
Es besteht ein Unterschied zwischen encoding htmlentities()
und escape mysql_real_escape_string()
. Ich hielt sie für ziemlich austauschbar. Aber nicht ... wie der gesunde Menschenverstand es dir sagen wird. :) Normalerweise ist es am besten, sie beide anzuwenden, wie zum Beispiel zuerst encodieren, dann entkommen.
Wenn Sie dann die Daten herausziehen, kehren Sie den Prozess um, unescape (falls erforderlich) und dann unencode. Beachten Sie, dass die Art und Weise, in der die Schritte ausgeführt werden (und umgekehrt), viele Kopfschmerzen und Doppelflucht vermeiden.
Ein Zeichen dafür, dass Sie ein Problem haben könnten, wäre die direkte Eingabe von Benutzereingaben in Ihren SQL-Befehl.
Sie fragen zum Beispiel nach ihrem Benutzernamen. Wenn du es nimmst und dann einfach
sagst"Wählen Sie * Von Benutzern mit Benutzername = '$ USERNAME';"
Der Benutzer könnte dann "JOE"; Drop Table ... "hinzufügen und so weiter.
In Perl können Sie etwas wie
sagen %Vor%Die execute-Methode würde dann nach Exploits wie dem oben genannten suchen und es richtig entziehen.
Ich benutze diese PHP-Funktion für alle Eingaben, bevor ich versuche, sie in irgendeinem Code zu verwenden (MySQL-Abfrage, Datenanzeige usw.). Es ist wahrscheinlich nicht vollständig, aber es sollte alle grundlegenden Versuche stoppen, das System zu hacken:
%Vor%Tags und Links php mysql database sql-injection