MySQL Injection Schutz und Verwundbarkeit Zeichen mit PHP

8

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:)

    
johnnietheblack 13.02.2009, 00:39
quelle

7 Antworten

15

Verwenden Sie vorbereitete Anweisungen, anstatt die Anweisung und die tatsächlichen Nutzdaten zu mischen.

siehe

Sie könnten auch an Ссылка und Ссылка

    
VolkerK 13.02.2009, 00:45
quelle
8

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

    
PartialOrder 13.02.2009 01:14
quelle
1

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.

    
tliff 13.02.2009 00:42
quelle
1

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.

    
Parrots 13.02.2009 00:50
quelle
1

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.

    
null 13.02.2009 01:14
quelle
0

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.

    
Rob Haupt 13.02.2009 00:50
quelle
0

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%     
Andrew Ensley 13.02.2009 01:05
quelle

Tags und Links