Frage

Gestern habe ich mit einem Entwickler sprach, und er erwähnte etwas über die Einfügungen auf Datenbankfeld zu beschränken, wie, Strings wie -- (minus minus).

In der gleichen Art, was ich weiß ist, dass ist ein guter Ansatz HTML Zeichen wie < zu entkommen, > etc. Nicht --. Ist das wahr? Muss ich über -- Sorge, ++? Ist es eher wie ein Mythos oder alte Sachen?


Update

Vielen Dank für alle Antworten, ist es einfach, so zu verstehen, da ich auf all diese Art von neu bin. Nun, um genauer zu sein in diesem Fall unsere Diskussion war über und C # ASP.NET MVC Website wir entwickeln, so dass es ein komplexes ein Konto Form mit wichtigen Informationen in dort öffnen, also bin ich nicht sicher, ob MVC mit Linq to Schnittstelle mit Datenbank kommt bereits mit dieser Art von Schutz oder nicht. Also, wenn jemand ein paar Hinweise darüber liefert könnte, wäre es toll. Nochmals vielen Dank

War es hilfreich?

Lösung

Der richtige Weg, SQL-Injection-Angriffe zu vermeiden, ist nicht einfach bestimmte problematische Zeichen zu verbieten, sondern parametrisierte SQL zu verwenden. Kurz gesagt, verhindert parametrisierte SQL die Datenbank roh Benutzereingaben als Teil des SQL-Befehl ausgeführt wird dies verhindert, dass Benutzereingaben wie „Drop-Tabelle“ aus ausgeführt werden. nicht alle Formen von SQL-Injection-Angriffe stoppen und ohne bestimmte Wörter zu entkommen nur Zeichen wie „Drop“ funktioniert nicht in allen Fällen; es kann bestimmte Felder, in denen „Tropfen“ ein absolut gültiger Teil der Dateneingabe ist.

Sie können einige gute Artikel zum Thema paramaterized SQL finden Sie hier:

https: //blog.codinghorror. com / Give-me-parametrisierte sQL-oder-Give-me-Tod /

http://www.codeproject.com/KB/database/ParameterizingAdHocSQL.aspx

Nun, da Sie erwähnen, dass Sie mit ASP.net arbeiten kann ich Ihnen einige Links geben, die spezifisch mit SQL-Injection in ASP behandeln.

https://dzone.com/articles/aspnet-preventing-sql-injectio http://www.codeproject.com/KB/aspnet/SQL_Injection_. aspx? msg = 3209511

Hier ist ein allgemeiner Artikel auf Ihrer ASP sicherer zu machen: http://www.codeproject.com/KB/web-security/Securing_ASP_NET_Apps. aspx

Und natürlich der MSDN-Artikel auf SQL-Injection: http://msdn.microsoft.com/en-us/library/ms998271. aspx

Andere Tipps

SQL-Injection ist ein hohes Sicherheitsrisiko für die meisten Websites, die Benutzern erlauben, Parameter in eine Aussage zu spritzen, die auf einer Datenbank ausgeführt wird.

Ein einfaches Beispiel wäre:

Eingabefeld „Name: _________

"SELECT * FROM tblCustomer WHERE Name = '" + nameInputField + "'"

Also, wenn ich schreibe in "Bob" wir haben

"SELECT * FROM tblCustomer WHERE Name = 'Bob'"

Aber wenn ich in „'; DROP TABLE tblCustomer“ geben wir am Ende mit der eher unheimlicher

"SELECT * FROM tblCustomer WHERE Name = ''; DROP TABLE tblCustomer"

Es gibt viele Möglichkeiten, um diese Probleme zu vermeiden, und viele sind gebaut, in welcher Sprache Sie verwenden - so anstatt denke an all die zwielichtigen Möglichkeiten „“, „-“, „/ *“ usw., versuchen und verwenden etwas, das bereits vorhanden ist.

Shout heraus, welche Sprache Sie verwenden, und ich bin sicher, wir können Ihnen sagen, wie diese Angriffe zu vermeiden.

Er sprach über SQL-Injection-Angriffe , wie ganz richtig ist, was er gesagt hat.

Das Problem ist nicht mit solchen Daten in der Datenbank vorhandenen, aber Eingangsdaten direkt auf die Datenbank im Vorbeigehen, ohne es zu desinfizierend.

Ohne sie Aufräumen, wenn jemand in einem String geht mit einem ; enden können sie es dann folgen mit, was sie wollen (select * from sys.objects, zum Beispiel) oder etwas bösartig, wie einige Tische fallen.

Es ist schwierig, gegen vollständig zu schützen, aber wenn man eine gute DB-Bibliothek aus Ihrem Code verwendet und folgt bekannte Praktiken, wie die Verwendung von paremeterized Abfragen begrenzen Sie den möglichen Schaden.

Speicher als viele -- in Ihrer Datenbank, wie Sie wollen, aber nicht passieren, dass durch zu Ihrer Datenbank durch einen Bereinigungsprozess ohne zu gehen (das ist, wo eine gute DB-Bibliothek ist wichtig - es sollte Bereinigungs Zitate und anderer potenziell schädlicher Eingang) .

Es gibt nichts "gefährlich" über einen String mit -- in einer Datenbank eingefügt wird.

Es ist gefährlich, einfügen alles in einer Datenbanktabelle, die ohne Verarbeitung direkt aus Benutzereingaben kommt, sonst hat man sich offen lassen auf SQL-Injection-Angriffe . Beispiel: Ein Coder gibt den Anwender in ihrem Namen in einem Feld, und die Benutzertypen:

Joe '); drop table users; commit transaction; --

und dann der Codierer legt, dass in ihrer MySQL-Datenbank wie folgt:

conn.execute("insert into users (username) values ('" + userInput + "')");

Boom Der Benutzer kann die Benutzer-Tabelle gelöscht (vorausgesetzt, die Datenbank-Login-Rechte, dass zu tun hatte, die es nicht sollte - aber das ist ein anderes Thema), weil der Codierer nicht gewährleisten dass die Zeichenfolge vom Benutzer richtig waren entkommen, und so wurde es ein gutes Lachen direkt an die DB-Engine und der Angreifer hat gesendet. : -)

Verwenden all Tools Ihre Umgebung, um sicherzustellen, sieht vor, dass Strings richtig entkommen ist. Zum Beispiel nutzt JDBC die PreparedStatement Klasse für diese. Die meisten Umgebungen wird etwas ähnliches haben.

parametrisierte Abfragen verwenden. Diese Abfragen stellen die Variablen als Platzhalter in der SQL, wie select * from person where name = ?. Nachdem die SQL-Abfrage erstellen, setzen Sie die Parameterwerte in der Abfrage. Parametrisierte Abfragen sicher, dass das, was für den Platzhalter ersetzt wurde, wird nicht als Teil der SQL-Anweisung in Betracht gezogen werden.

Siehe Jeff Atwood Artikel für einen guten Überblick über parametrisierte Abfragen.

Es ist nicht gefährlich, solange Sie die Daten richtig entweichen kann, wenn INSERT tun / UPDATE /...

Und Zeichen HTML Flucht ist nicht ein guter Ansatz. Stellen Sie sich eine Funktion geschrieben, die solche Zeichen entkommt und Sie haben einige entkamen Text in der Datenbank gespeichert. Dann sind Sie feststellen, dass Ihre Funktion nicht entging ‚<‘, so dass Sie die Funktion ändern ... nun, was passiert mit den Datensätzen, die bereits in der Datenbank vorhanden sind? - Die ‚<‘ Zeichen bleiben unescaped. So NIE Text entkommen, bevor sie in der Datenbank (Escape die SQL-Abfrage, natürlich) zu speichern. Austretende passieren soll, wenn die HTML / XML / ... Seite aus dem Text erzeugt wird, das heißt, nach dem ursprünglichen Text aus der Datenbank abfragen!

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