Frage

Wenn aus einer SQL-Abfrage, die ich all 'Zeichen zu entfernen, gibt es eine andere Möglichkeit, um einen SQL-Injection-Angriff auf der Datenbank zu tun?

Wie kann es geschehen? Kann jemand mir Beispiele nennen?

War es hilfreich?

Lösung

Ja, es gibt. Ein Auszug aus Wikipedia

"SELECT * FROM data WHERE id = " + a_variable + ";"

Es ist von dieser Aussage klar, dass der Autor a_variable sollte eine Zahl auf das „id“ Feld korreliert sein. Wenn es jedoch eine Zeichenfolge in der Tat ist dann der Endverbraucher kann die Anweisung manipulieren, wie sie wollen, wodurch die Notwendigkeit für Escape-Zeichen umgehen. Zum Beispiel Einstellung a_variable zu

1;DROP TABLE users

wird fallen (löschen), um die „Benutzer“ Tabelle aus der Datenbank, da die SQL gemacht werden würde wie folgt:

SELECT * FROM DATA WHERE id=1;DROP TABLE users;

SQL-Injection ist nicht ein einfacher Angriff zu kämpfen. Ich würde sehr vorsichtig Forschung tun, wenn ich du wäre.

Andere Tipps

Ja, abhängig von der Anweisung Sie verwenden. Sie sind besser dran, sich zu schützen, entweder durch Stored Procedures, oder zumindest parametrisierte Abfragen.

Siehe WikiPedia zur Prävention Proben.

Ja, es ist definitiv möglich.

Wenn Sie ein Formular, in dem Sie eine ganze Zahl erwarten, dass Ihre nächste SELECT-Anweisung machen, dann können Sie alles eingeben ähnlich:

SELECT * FROM thingy WHERE attributeID =

  • 5 (gute Antwort, kein Problem)
  • 5; DROP Tabelle users; (Schlecht, schlecht, schlecht ...)

Die folgende Website Details weiter klassische SQL-Injection-Technik: SQL-Injection-Spickzettel .

parametrisierte Abfragen oder gespeicherte Prozeduren zu verwenden ist nicht besser. Dies sind nur vorgefertigte Abfragen der übergebenen Parameter verwendet, die Quelle der Injektion kann genauso gut. Es wird auch auf dieser Seite beschrieben: Offensiv Stored Procedures in SQL

Wenn Sie nun das einfache Zitat unterdrücken, verhindern, dass Sie nur einen bestimmten Satz von Angriff. Aber nicht alle von ihnen.

Wie immer, kein Vertrauen in Daten von außen kommen. Filtern sie bei diesen drei Ebenen:

  • Interface-Level für offensichtliche Sachen (eine Drop-Down-Auswahlliste ist besser als ein Freitextfeld)
  • Logische Ebene für die Kontrolle der Daten Zusammenhang mit der Natur (int, string, length), Berechtigungen (kann auf dieser Seite diese Art von Daten, die von diesem Benutzer verwendet werden) ...
  • Datenbank Zugriffsebene (entkommen einfaches Zitat ...).

Haben Sie Spaß und vergessen Sie nicht, WikiPedia nach Antworten zu überprüfen.

/ Vey

Ich schlage vor, Sie die Variablen als Parameter übergeben, und nicht Ihre eigene SQL zu bauen. Ansonsten gibt und wird immer eine Möglichkeit geben, eine SQL-Injektion zu tun, in einer Weise, die wir derzeit nicht bewusst ausgeschaltet sind.

Der Code, den Sie erstellen, ist dann so etwas wie:

' Not Tested
var sql = "SELECT * FROM data WHERE id = @id";
var cmd = new SqlCommand(sql, myConnection);
cmd.Parameters.AddWithValue("@id", request.getParameter("id"));

Wenn Sie einen Namen wie Mine mit einem "drin. Es ist sehr ärgerlich, dass alle ‚-Zeichen entfernt oder als ungültig markiert.

Sie können auch in diesem Stackoverflow Frage zu SQL Injections aussehen wollen .

Parameterized Inline-SQL oder parametrisierte gespeicherte Prozeduren ist der beste Weg, um sich zu schützen. Wie andere haben darauf hingewiesen, einfach Strippen / die einzelne Anführungszeichen zu entkommen ist nicht genug.

Sie werden feststellen, dass ich speziell über „parametrisiert“ Stored Procedures sprechen. Einfach eine gespeicherte Prozedur ist nicht genug, wenn entweder die Prozedur der übergebenen Parameter zusammen zu verketten zurück. Mit anderen Worten, in einer gespeicherten Prozedur genau das gleiche verwundbar SQL-Anweisung Verpackung macht es nicht nicht sicherer. Sie müssen Parameter in Ihrer gespeicherten Prozedur verwenden, so wie Sie es mit Inline-SQL.

Auch-auch wenn Sie nur für den Apostroph schauen Sie, die Sie nicht wollen, es zu entfernen. Sie möchten entkommen es. Sie tun das, indem er jeden Apostroph mit zwei Apostrophe zu ersetzen.

Aber parametrisierte Abfragen / gespeicherte Prozeduren sind so viel besser.

Diese Da eine relativ ältere Frage, ich Mühe wird nicht eine vollständige und umfassende Antwort schriftlich auf, da die meisten Aspekte dieser Antwort sind durch ein Plakat oder eine andere hier erwähnt.
Ich mache es für notwendig erachten, jedoch auf ein anderes Thema zu bringen, die auf nicht berührt wurden von jemandem hier - SQL-Schmuggel. In bestimmten Situationen ist es möglich, die Anführungszeichen 'in Ihre Abfrage zu „schmuggeln“ , auch wenn Sie es zu entfernen versucht . In der Tat kann dies möglich sein, auch wenn Sie verwendete richtige Befehle, Parameter, Stored Procedures etc.

Überprüfen Sie die vollständige Forschungs Papier unter http://www.comsecglobal.com/ framework / Upload / SQL_Smuggling.pdf (Offenlegung, ich war die primären Forscher auf diesem) oder einfach nur google "SQL Schleusung".

. . . uh über 50000000 andere Möglichkeiten

vielleicht somthing wie 5; drop table employees; --

, SQL kann so etwas wie: select * from somewhere where number = 5; drop table employees; -- and sadfsf

(-- startet einen Kommentar)

Ja, absolut. Je nach SQL-Dialekt und so gibt es viele Möglichkeiten, Einspritzung zu erreichen, die den Apostroph nicht verwenden

Die einzige zuverlässige Verteidigung gegen SQL-Injection-Angriffe verwendet die parametrisierte SQL-Anweisung Unterstützung durch die Datenbank-Schnittstelle angeboten.

Rather, dass die Zeichen, um herauszufinden, um herauszufiltern, würde ich bleiben Abfragen parametrisiert statt und entfernen Sie das Problem vollständig.

Es hängt davon ab, wie Sie die Abfrage zusammen, aber im Grunde ja.

Zum Beispiel in Java wenn du dieses (absichtlich ungeheuerliches Beispiel) tun:

 String query = "SELECT name_ from Customer WHERE ID = " + request.getParameter("id");

dann gibt es eine gute Chance, dass Sie sich bis zu einem Injektions Angriff öffnen.

Java einige nützliche Tools hat gegen diese zu schützen, wie PreparedStatements (wo man in einem String übergeben wie „SELECT name_ von Kunden WHERE ID =?“ Und die JDBC-Schicht entweicht behandelt, während das Ersetzen der? Token für Sie), aber einige andere Sprachen sind nicht so hilfreich für diese.

Die Sache ist Apostroph ist vielleicht echt Eingang, und Sie haben sie zu entkommen, indem sie zu verdoppeln, wenn Sie Inline-SQL in Ihrem Code verwenden. Was Sie suchen ist ein RegexMuster wie:

\;.*--\

Ein Semikolon der echte Erklärung vorzeitig beenden verwendet, gefolgt einige injizierte SQL durch einen doppelten Bindestrich der nachgestellten SQL aus der ursprünglichen Original-Aussage Kommentar aus. Die Bindestriche können im Angriff verzichtet werden.

Daher lautet die Antwort: Nein, einfach Apostrophe Entfernen gaurantee Sie nicht die Sicherheit von SQL Injection

.

Ich kann nur wiederholen, was andere gesagt haben. Parametrisierte SQL ist der Weg zu gehen. Sicher, es ist ein bisschen wie ein Schmerz im Hintern es Codierung - aber sobald man es einmal getan hat, dann ist es nicht schwer zu schneiden und diesen Code einfügen, und machen Sie die Änderungen, die Sie benötigen. Wir haben eine Menge von .Net-Anwendungen, die Website-Besucher geben Sie eine ganze Reihe von Suchkriterien ermöglichen, und der Code erstellt die SQL-Anweisung Select on the fly - aber alles, was geht in einem Parameter von einem Benutzer eingegeben werden können.

Wenn Sie einen numerischen Parameter erwarten, sollten Sie immer die Eingabe werden Validieren, um sicherzustellen, es ist numerisch. Darüber hinaus hilft gegen Injektion zu schützen, wird der Validierungsschritt die App benutzerfreundlicher machen.

Wenn Sie jemals id = „Hallo“ an, wenn Sie id = 1044 erwartet, ist es immer besser, einen nützlichen Fehler an den Benutzer zurück, anstatt dass die Datenbank einen Fehler zurück.

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