Phil Z.: Wie schütze ich mich am besten vor SQL-Injektion?

Hallo.

Ich würde gerne mal in Erfahrung bringen, wie ich mich am besten gegen SQL-Injektions schütze?

Gibt es noch andere Methoden außer das eingeben von Sonderzeichen zu unterlassen d.h. wenn im Namen z.B.  eins von den Zeichen /?!+<>=()&%$ eingegeben wird, das Skript abgebrochen wird (per if schleife) und eine Fehlermeldung ausgegeben wird?

mfg

Phil Z.

  1. Hey,

    Ich würde gerne mal in Erfahrung bringen, wie ich mich am besten gegen SQL-Injektions schütze?

    mit Platzhaltern/Binding. Jede vernünftige Datenbankschnittstelle bietet das an. Blacklisting/Whitelisting/Escaping ist teils fehlerbehaftet, teils unbrauchbar, in jedem Fall die schlechtere Lösung.

    http://search.cpan.org/~timb/DBI-1.52/DBI.pm#Placeholders_and_Bind_Values
    http://pear.php.net/manual/en/package.database.db.intro-execute.php

    Hat einer die Links für Python, Ruby, Java?

    --
    水-金-地-火-木-土-天-海-冥
    1. Hi.

      mit Platzhaltern/Binding. Jede vernünftige Datenbankschnittstelle bietet das an. Blacklisting/Whitelisting/Escaping ist teils fehlerbehaftet, teils unbrauchbar, in jedem Fall die schlechtere Lösung.

      Oh mein Gott -.- das wird ne Googlelei. Könntest du etwas erklären was es mit Platzhaltern/Bindings auf sich hat? Danke. =)

      http://search.cpan.org/~timb/DBI-1.52/DBI.pm#Placeholders_and_Bind_Values
      http://pear.php.net/manual/en/package.database.db.intro-execute.php

      Na super^^ *sich das Wörterbuch raussuch*. Jetzt heißt es mal wieder übersetzen.

      mfg

      Philipp Zentner

      1. das wird ne Googlelei.

        Hab ich dir doch erspart mit den Deeplinks.

        Könntest du etwas erklären was es mit Platzhaltern/Bindings auf sich hat?

        Was genau? Die Codebeispiele sind meiner Meinung nach selbstsprechend.

        Der Platzhalter ist meist ?, bei .NET @bezeichner.
        Binding nennt sich der Vorgang.
        Die Methoden heißen häufig prepare zum Vorbereiten des Datenbankhandles, execute zum Ausführen der Anfrage. Oft kann man mehrmals dieselbe Anfrage mit unterschiedlichen Platzhaltern ausführen und spart Rechenzeit im Vergleich zur Ausführung ohne Platzhalter.

        HTH

        --
        水-金-地-火-木-土-天-海-冥
        1. das wird ne Googlelei.
          Hab ich dir doch erspart mit den Deeplinks.

          Ich meitne die Erklärung der Begriffe.

          Könntest du etwas erklären was es mit Platzhaltern/Bindings auf sich hat?
          Was genau? Die Codebeispiele sind meiner Meinung nach selbstsprechend.

          Es geht ´mir darum mir erstmal zu erklären was überhaupt passiert.
          Was wird überhaupt gemacht damit ich mich schützen kann. Was geht da vor sich?
          Bisher sieht es für mich aus als würden willkürlich irgendwelche Felder mit ? gefüllt.

          mfg

          Phil Z.

      2. Hallo Philipp,

        http://search.cpan.org/~timb/DBI-1.52/DBI.pm#Placeholders_and_Bind_Values

        http://pear.php.net/manual/en/package.database.db.intro-execute.php
        Na super^^ *sich das Wörterbuch raussuch*. Jetzt heißt es mal wieder übersetzen.

        Du hattest doch mal gefragt, welche Sprache Du als nächstes erlernen solltest. Ich empfehle Dir Englisch ...

        Freundliche Grüße

        Vinzenz, who couldn't resist :-)

    2. Pfui Microsoft, bei euch allein hab ich doppelt so lange recherchiert wie für die restlichen Systeme zusammen!

      http://www.python.org/dev/peps/pep-0249/ die Methode heißt .execute
      http://ruby-dbi.rubyforge.org/ die Methoden heißen .prepare und .execute
      http://java.sun.com/j2se/1.5.0/docs/api/java/sql/PreparedStatement.html
      http://www.hibernate.org/hib_docs/v3/reference/en/html/objectstate.html#objectstate-querying-executing-parameters
      http://msdn2.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare.aspx

      So. Und wenn ich jetzt noch einen erwische, der's falsch macht, kriegt gleich eins hinter die Löffel! :)

      --
      水-金-地-火-木-土-天-海-冥
    3. hi,

      mit Platzhaltern/Binding. Jede vernünftige Datenbankschnittstelle bietet das an. Blacklisting/Whitelisting/Escaping ist teils fehlerbehaftet, teils unbrauchbar, in jedem Fall die schlechtere Lösung.

      Und welche Magie findet beim Binding statt, die die (bitte noch zu benennenden) Nachteile/Fehler des Escapings nicht hätte?

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
      1. Ich habe nie Magie gesagt. Intern wird mit Bedacht gequotet. Betrachte bitte das Gesamtbild.

        ① Escaping/Quoting kann man vergessen. Schussliger Code ohne funktioniert trotzdem in den meisten Fällen. Bei Binding braucht man zwangläufig ein prepare und ein bis mehrere execute. Eins geht ohne das andere nicht. Es gibt nichts, was man banal vergessen könnte.
        ② Der intuitive Ansatz (Blacklisting mit regulären Ausdrücken), wie im Ausgangsposting demonstriert, ist falsch. Das sollte schon aus dem Themenkreis Eingabevalidierung bekannt sein. Verlässt man sich auf Binding, macht man sich die Schlauheit der Leute, die wirklich Ahnung vom Thema haben, sprich tatsächlich den ISO-Standard durchgeackert und dazu Tests geschrieben haben, zu Nutze. Die Sache mit dem SELF hat auch ihre Schattenseiten, man darf das nicht aus den Augen verlieren.
        ③ Prepared Statements, wenn klug eingesetzt, gehen nicht so verschwenderisch mit der Rechenzeit für die Datenbank um wie normale Abfragen.
        ④ Die Links, die ich gegeben habe, führen zu Software, die Binding als Teil eines DB-Abstraktionslayers bietet. Ich fördere somit guten Stil, denn damit lässt sich datenbankübergreifend oder -neutral programmieren. Sollte der geneigte Programmierer eines Morgens aufwachen und merken, dass MySQL eine Spielzeugdatenbank ist, hält sich die Anpassung der Quellen ans bessere DBMS in Grenzen, im günstigsten Falle ohne Änderung.

        Meine Aussage zum Thema des Threads steht.

        --
        水-金-地-火-木-土-天-海-冥
    4. echo $begrüßung;

      http://pear.php.net/manual/en/package.database.db.intro-execute.php

      Seit Version 5 bietet PHP die Platzhalter-Funktionalität auch selbst an. Man muss dazu nur auf die mysqli-Extension oder auf PDO wechseln. Man muss dabei auf "bind" in den Funktions- bzw. Methodennamen Ausschau halten und findet dann Anwendungsbeispiele im Handbuch.

      echo "$verabschiedung $name";

  2. Hallo Phil,

    Ich würde gerne mal in Erfahrung bringen, wie ich mich am besten gegen SQL-Injektions schütze?

    Das ist eine gute Idee!

    Gibt es noch andere Methoden außer das eingeben von Sonderzeichen zu unterlassen d.h. wenn im Namen z.B.  eins von den Zeichen /?!+<>=()&%$ eingegeben wird, [..]

    Hiermit verbietest Du problemlose Zeichen (zum Beispiel +) und erlaubst gefährliche (zum Beispiel ").

    Statt des Filterns kann man die „gefährlichen“ Zeichen escapen. Dann wird beispielsweise aus Stri"ng Stri"ng. Wenn Du uns verrätst, mit welcher Sprache Du auf welche Datenbank zugreifst, wird man Dir in diesem Punkt bestimmt weiterhelfen können.

    das Skript abgebrochen wird (per if schleife) [..]

    Nebenbemerkung: Eine if-Schleife gibt es nicht, da bei if nichts wiederholt wird.

    Gruß
    Olaf

    1. Hi.

      Hiermit verbietest Du problemlose Zeichen (zum Beispiel +) und erlaubst gefährliche (zum Beispiel ").

      Ich weiß ich wollte jetzt nicht alle auflisten. Ich werde alle Sonderzeichen verbieten.

      Statt des Filterns kann man die „gefährlichen“ Zeichen escapen. Dann wird beispielsweise aus Stri"ng Stri"ng. Wenn Du uns verrätst, mit welcher Sprache Du auf welche Datenbank zugreifst, wird man Dir in diesem Punkt bestimmt weiterhelfen können.

      Ich benutze PHP.

      das Skript abgebrochen wird (per if schleife) [..]

      Nebenbemerkung: Eine if-Schleife gibt es nicht, da bei if nichts wiederholt wird.

      Oh stimmt hast Recht -.-, hab schneller geschrieben als nachgedacht.
      mfg

      Philipp Z.

      1. Hallo Philipp,

        Ich weiß ich wollte jetzt nicht alle auflisten. Ich werde alle Sonderzeichen verbieten.

        Da gibt es noch andere Möglichkeiten, und zwar …

        Ich benutze PHP.

        … aha, PHP und – lass mich raten – MySQL? Dann könnte Dir mysql_escape_string() oder mysql_real_escape_string() weiterhelfen.

        Gruß
        Olaf

        1. echo $begrüßung;

          … aha, PHP und – lass mich raten – MySQL? Dann könnte Dir mysql_escape_string() oder mysql_real_escape_string() weiterhelfen.

          Die Verwendung der "real"-Variante ist zu bevorzugen, da die mysql_escape_string() wegen unzureichender Arbeitsweise mittlerweile missbilligt ist (siehe PHP-Handbuch zu beiden Funktionen).

          echo "$verabschiedung $name";

      2. Hi,

        Ich weiß ich wollte jetzt nicht alle auflisten. Ich werde alle Sonderzeichen verbieten.

        Definitiv der falsche Ansatz! Blacklists sind fast immer schlecht. Richtig müsste es heißen: Ich werde nur Buchstaben (oder nur Buchstaben und Zahlen) erlauben. Denn du kannst fast drauf wetten, das dir irgendwelche unbekannten Sonderzeichen durchrutschen.

        Marc

  3. Sup!

    Kein SQL benutzen ;-)

    Gruesse,

    Bio

    --
    Never give up, never surrender!!!