Must-Know: Sql-Injection

    • Allgemein

    Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

      Must-Know: Sql-Injection

      Sehr oft bekommt man Codes wie diesen zu Gesicht:

      VB.NET-Quellcode

      1. Private Sub AddUser()
      2. Dim sSql = "INSERT INTO `User` (`Vorname`, `Nachname`) VALUES ('" & TextBox1.Text & "', '" & TextBox2.Text & "')"
      3. 'command damit füttern und abfahren
      4. End Sub

      Wenn ich nun in Textbox1 "Heinz" eingebe, und in Textbox2 "Hacker", so erhalte ich als Wert von sSql dieses:

      SQL-Abfrage

      1. INSERT INTO `User` (`Vorname`, `Nachname`) VALUES ('Heinz', 'Hacker')
      So ist das wohl gedacht, und in Ausführung wird das einen Datensatz in die Tabelle `User` schreiben.

      Was aber, wenn ein Bösewicht in Textbox2 nun folgendes komisches als "Nachname" eintippt: Hacker'); DROP TABLE `User`; --

      Dann erhalte ich sSql als:

      SQL-Abfrage

      1. INSERT INTO `User` (`Vorname`, `Nachname`) VALUES ('Heinz', 'Hacker'); DROP TABLE `User`; --')
      Das sind nun zwei Sql-Kommandos in einer Zeile.
      Und - bitte hinschauen! - in Ausführung löscht das zweite Kommado die Tabelle `User`

      ups! 8|

      Ja, so geht Sql-Injection :D
      Ich hoffe, nun klar, wie kriminell fahrlässig es ist, Sql-Statements veränderlichen Inhalts ohne Verwendung von DbParametern an eine Datenbank zu senden.

      Nachworte
      • Danke an @Niko Ortner, der das Sample in diesem Post formuliert hat: Was sind Injections? - Kleine Erklärung
      • Nicht, dass jmd denkt, ich sei der einzige Spinner, der DbParameter als "Must-Use - No-Excuces" propagiert: Sinngemäß dasselbe (und noch weitere Argumente) kann man zB auch hier nachlesen - man sieht: es gilt ebenso für c#.
      • Bitte statt Antwortposts lieber PM an mich. Diesen Tipp möchte ich als ganz konzentriert erhalten.

      Dieser Beitrag wurde bereits 14 mal editiert, zuletzt von „ErfinderDesRades“ ()

      Scheint aber kaum einen zu jucken.
      Mach einfach mal eine Forum-Suche nach "Insert Into" - dann siehst du, wieviele das "wissen"

      Aber wie in Post#1 im "Nachworte"-Spoiler bereits ausdrücklich erbeten:
      Ich würde dieses Tut gerne konzentriert erhalten und nicht zerlabern, auch nicht mit der Erörterung korrekter Vorgehensweisen.

      Der korrekte Ansatz ist ja genannt: DbParameter.
      Und ich wiederhole: Ich möchte das hier nicht erörtern, denn es gibt viele Möglichkeiten der Umsetzung. Manche, händische sind sehr umständlich, andere recht elegant, und beziehen DataAdapter, CommandBuilder, Databinding, Extension-Functions oder typisierte TableAdapter mit ein.

      Die meiner Meinung nach Minimal-Lösung, mit Extension-Functions, ist hier gezeigt: Tipp & Trick: DbParameter
      Dort ist übrigens auch ein viel leistungsfähigerer Datenzugriff gezeigt, der Databinding unterstützt, und noch weitere Probleme löst, die hier noch garnet erwähnt sind.
      (Edit: Die leight-weigth-Variante des Letzteren gibts neuerdings hier: Dataset->Db )

      Jdfs. in diesem Tut sei einzig auf den Punkt gebracht, und ohne Verwässerung herausgestellt und begründet, dass Db-Zugriffe ohne DbParameter ein Ausmaß an Fahrlässigkeit darstellen, das wirklich ans kriminelle grenzt - bedenkt man die Schäden, die daraus entstehen können.

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()