2008-09-05 6 views
7

Hier sind ein paar Möglichkeiten, um das Gespräch zu erhalten begonnen:Wie verhindern Sie die SQL-Injektion in LAMP-Anwendungen?

  1. Flucht alle Eingaben bei der Initialisierung.
  2. Entkomme jeden Wert, vorzugsweise beim Generieren des SQL.

Die erste Lösung ist nicht optimal, da man dann jeden Wert müssen unescape, wenn Sie es in etwas anderes als SQL verwenden möchten, wie es auf einer Webseite ausgegeben werden.

Die zweite Lösung macht viel mehr Sinn, aber manuell jeden Wert zu entkommen ist ein Schmerz.

Ich kenne prepared statements, jedoch finde ich MySQLi umständlich. Auch die Trennung der Abfrage von den Eingaben betrifft mich, denn obwohl es wichtig ist, die Reihenfolge richtig zu machen, ist es leicht, einen Fehler zu machen und somit die falschen Daten in die falschen Felder zu schreiben.

Antwort

7

als @Rob Walker Staaten, parametrisierte Abfragen sind Ihre beste Wette. Wenn Sie die neueste und beste PHP verwenden, würde ich empfehlen, einen Blick auf (PHP Data Objects) zu werfen. Dies ist eine native Datenbankabstraktionsbibliothek, die Unterstützung für eine breite Palette von Datenbanken (einschließlich MySQL natürlich) sowie vorbereitete Anweisungen mit benannten Parametern bietet.

10

Vorbereitete Aussagen sind die beste Antwort. Sie haben Tests, weil Sie Fehler machen können!

Siehe this Frage.

-1

Ich habe immer die erste Lösung verwendet, weil 99% der Zeit Variablen in $_GET, $_POST und $_COOKIE nie an den Browser ausgegeben werden. Sie werden auch niemals Code mit einer SQL-Injection irrtümlich schreiben (es sei denn, Sie verwenden keine Anführungszeichen in der Abfrage), während Sie mit der zweiten Lösung leicht vergessen können, irgendwann einer Ihrer Strings zu entkommen.

Eigentlich war der Grund, warum ich es immer so gemacht habe, weil alle meine Seiten die magic_quotes-Einstellung standardmäßig hatten, und wenn man viel Code mit einer dieser beiden Lösungen geschrieben hat, braucht es viel von der Arbeit, um zum anderen zu wechseln.

1

Ich würde mit vorgefertigten Anweisungen gehen. Wenn Sie vorbereitete Anweisungen verwenden möchten, sollten Sie wahrscheinlich die PDO-Funktionen für PHP ausprobieren. Auf diese Weise können Sie nicht nur vorbereitete Anweisungen ausführen, sondern Sie können auch etwas mehr Datenbank-agnostisch sein, indem Sie keine Funktionen aufrufen, die mit mysql_, mysqli_ oder pgsql_ beginnen.

0

PDO kann sich eines Tages gelohnt haben, aber es ist noch nicht alles da. Es ist ein DBAL und es ist (vermeintlich) das Umschalten zwischen den Anbietern einfacher zu machen. Es ist nicht wirklich gebaut, um SQL-Injektionen zu fangen.

Wie auch immer, Sie wollen Ihre Eingaben zu entkommen und zu sanieren, mit vorbereiteten Anweisungen könnte ein gutes Maß sein (ich zweite, dass). Obwohl ich glaube, dass es viel einfacher ist, z.B. unter Verwendung von filter.