none
C#,SQL,Schlüsselwörter RRS feed

  • Frage

  • Hallo,

    vor einiger Zeit bin ich als Anfänger über einen Sachverhalt gestolpert,

    der auch für andere Newcomer von Interesse sein könnte.

    Es geht um Folgendes:

     - ich habe eine Datenbank zB. *.mdb

    - aus dieser selektiere ich mit (Thema = Name der Spalte)

    ...  "WHERE Thema LIKE '"+"%"+leseThe+"%"+"' "+  .....

    Zelleninhalte (und damit Datensätze), die den String  "leseThe"  enthalten.

    Zufällig hatte der string "leseThe" einmal die Form zB.: Lenz'sche Regel,

    also ein String mit einem einfachen Hochkomma.

    Ergebnis : Programmabsturz !

    Es hat einige Zeit gedauert, bis ich die Ursache fand.

    Conclusion: Es gibt anscheinend nicht nur reservierte Schlüsselwörter,

    sondern auch reservierte Sonderzeichen. Ich habe den Verdacht, daß dazu

    u.U. neben ' auch %,&,[,] gehören könnten !?

    Ich habe das Problem umgangen, indem ich das Hochkomma ' durch ein

    Accent auf Blank zur Runtime ersetzt habe. Das schaut ähnlich aus.

    Vielleicht kann jemand mit dieser Info etwas anfangen.

    Gruß !

    Hermann

     

     

    Freitag, 21. Mai 2010 10:32

Antworten

  • Hallo Hermann,

    solche Sonderzeichen sind der Hauptgrund, warum das Verketten von SQL Anweisungen,
    insbesondere für Parameter "böse" ist, weil es eine SQL Injection ermöglicht -
    bzw. auch ohne den Teufel an die Wand zu malen, zu Fehlern führen kann.

    Gewöhne Dir an durchweg mit Paramtern zu arbeiten, wie es im MSDN Artikel
    neben einigen anderen Vorkehrungen gezeigt wird.

    Und natürlich solltest Du die Dokumentation zu dem jweiligen SQL Dialekt
    zu Rate ziehen, wie z. B. beim SQL Server: Elemente von Transact-SQL

    So begrenzen Anführungsstriche (einfache in TRANSACT/ANSI-SQL oder
    doppelte in Access/Jet - bei T-SQL je nach Konfiguration ) Zeichenketten.
    Doppelte Anführungsstriche in ANSI/TRANSACT-SQL oder eckige Klammern
    in Jet/TRANSACT-SQL (allerdings auch nur dort) begrenzen Bezeichner,
    und erlauben so die Verwendung von reservierten Wörtern.
    Wie man schon daran sehen sollte, sind die Interpretationsweisen für
    grundlegende Dinge in den Dialekten unterschiedlich.

    Richtig wäre im übrigen das Verdoppeln des Anführungsstriches bzw.
    für eckige (geöffnete) Klammern.

    Gruß Elmar

    Freitag, 21. Mai 2010 10:51
    Beantworter

Alle Antworten

  • Hallo Hermann,

    solche Sonderzeichen sind der Hauptgrund, warum das Verketten von SQL Anweisungen,
    insbesondere für Parameter "böse" ist, weil es eine SQL Injection ermöglicht -
    bzw. auch ohne den Teufel an die Wand zu malen, zu Fehlern führen kann.

    Gewöhne Dir an durchweg mit Paramtern zu arbeiten, wie es im MSDN Artikel
    neben einigen anderen Vorkehrungen gezeigt wird.

    Und natürlich solltest Du die Dokumentation zu dem jweiligen SQL Dialekt
    zu Rate ziehen, wie z. B. beim SQL Server: Elemente von Transact-SQL

    So begrenzen Anführungsstriche (einfache in TRANSACT/ANSI-SQL oder
    doppelte in Access/Jet - bei T-SQL je nach Konfiguration ) Zeichenketten.
    Doppelte Anführungsstriche in ANSI/TRANSACT-SQL oder eckige Klammern
    in Jet/TRANSACT-SQL (allerdings auch nur dort) begrenzen Bezeichner,
    und erlauben so die Verwendung von reservierten Wörtern.
    Wie man schon daran sehen sollte, sind die Interpretationsweisen für
    grundlegende Dinge in den Dialekten unterschiedlich.

    Richtig wäre im übrigen das Verdoppeln des Anführungsstriches bzw.
    für eckige (geöffnete) Klammern.

    Gruß Elmar

    Freitag, 21. Mai 2010 10:51
    Beantworter
  • Hallo Elmar,

    danke für die prompte Antwort.

    Auf dieses Problem - SQL Injection - wäre ich nicht gekommen.

    Vorallem der MSDN Artikel liest sich wie ein Kriminalreport. Jedenfalls

    übersteigt das Thema meinen derzeitigen Wissensstand noch bei Weitem, ich war schon froh,

    das Programm einmal zum Laufen zu bringen.

    Dieses muß ich jetzt erst noch fertig machen, dann werde ich es entsprechend überarbeiten.

    Dazu darf ich mich ggf. wieder melden.

    Beste Grüße !

    Hermann

     

    Freitag, 21. Mai 2010 17:17