Frage

Sind sie weniger anfällig für SQL-Injection als Sachen wie mysql_query("SELECT important_data FROM users WHERE password = $password") tun?

War es hilfreich?

Lösung

Sie sind sicherer als das, was Sie tun. Ihre Anfrage wird Entsendung raw SQL auf die db was bedeutet, dass Ihre Parameter nicht als SQL-Parameter behandelt, sondern als einfache alte SQL.

Hier ist, was ich meine.

Mit einem gespeicherten prococedure das Passwort Variable nicht SQL sein kann, hat es eine Information sein, das System sucht. In Ihrem Beispiel, was tatsächlich an die DB gesendet wird,

SELECT * FROM Benutzer in dem Passwort = ( 'Ihr Passwort hier' - $ Passwort Variable) ..... so jemand so etwas wie

tun kann

SELECT * FROM Benutzer WHERE Passwort = ( 'Ihr Passwort hier'; SELECT * FROM Benutzer - $ password Variable).

oder schlimmer noch:

SELECT * FROM Benutzer WHERE Kennwort =. ( 'Ihr Passwort hier'; DROP Datenbank Database_Name - $ password-Variable)

Eine nicht-dynamisch gespeicherte SQL-Prozedur wird nicht zulassen, weil der Eingangsparameter nicht als zusätzlichen SQL ausgeführt wird.

Parametrisierte SQL tut sich darum kümmern, aber technisch gespeicherten Prozeduren sind immer noch ein wenig sicherer, da der Benutzer den Zugriff auf Informationen in der Tabelle Lesezugriff nicht braucht. Es muss nur in der Lage sein, um die gespeicherte Prozedur auszuführen. Je nach Bedarf kann dies oder kommt nicht ins Spiel.

Andere Tipps

notwendigerweise nicht, könnten Sie die String-Verkettung in der es tun, und die Belichtung wäre das gleiche. Wenn Sie die dynamische SQL mit Parametervariablen (keine String-Verkettung SQL zu erzeugen) verwenden Sie recht sein würde gut geschützt.

Solange Sie Parameter verwenden und String-Verkettung nicht für Werte vom Benutzer eingegebenen verwenden, gibt es keine Gefahr von SQL-Injection sein. Stored Procedures sind ein bisschen „sicherer“ in diesem Aspekt, weil sie Sie ermutigen, Parameter zu verwenden. Aber wenn in dem Verfahren, das Sie tun so etwas wie

EXECUTE 'SELECT important_data FROM users WHERE password = ' + @password

Dann werden Sie wieder auf Platz 1 und sehr anfällig für SQL-Injektionen werden.

Außerdem gibt es so etwas wie „Prepared Statements“, die Verfahren nicht gespeichert werden, sondern können auch Parameter verwenden. Sie können daher verwendet werden, SQL-Injektion zu vermeiden als auch.

Es gibt keine sicheren Technologien. Technologien können nur in sicherer oder unsicheren Art und Weise verwendet werden.

Wie gesagt, erfordern gespeicherte Prozeduren etwas kreative Codierung SQL-Injektion zu ermöglichen - die dennoch geschieht. Nichts hindert Sie daran, Strings in ihnen, in einer SQL-Datenbank-Engine verketten, von denen ich weiß.

, wenn sie richtig parametriert und Sie tun dynamische SQL nicht dann sie sicherer sind und Sie werden auch von Ausführungsplan Wiederverwendung profitieren

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top