MySQL Queries richtig schreiben!

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Da mir in letzter Zeit oftmals aufgefallen ist, dass den meisten Mitgliedern hier im Forum dir richtige Schreibweise für MySQL Queries entweder nicht bekannt ist oder egal ist, möchte ich im Folgenden die richtige Schreibweise und ihre Gründe dafür aufzeigen. Diese Schreibweise gilt nicht nur für Pawno, sondern für jeden Anwendungszweck von MySQL, denn MySQL ist MySQL und ändert sich von Sprache zu Sprache nicht. Die falsche Schreibweise von MySQL Queries führt oftmals Probleme herbei und öffnet auch gelegentlich Sicherheitslücken für potentielle Angreifer. Daher ist bei der Schreibweise von MySQL Queries besonders Acht zu geben. In diesem Tutorial wird davon ausgegangen, dass MySQL bereits ein Begriff ist und der Verwendungszweck und die grundlegende Schreibweise von solchen Queries bekannt ist. Für Neueinsteiger in das Thema MySQL ist dieses Tutorial nicht geeignet und es wird empfohlen, dieses Thema nachzuschlagen, da es in der heutigen Welt der Programmierung ein großes Thema stellt, einen weites Anwendungsfeld hat und vor allem für ein Einstieg in das Thema Database Management System (DBMS) sehr gut geeignet ist. Schießen wir los ...



    Inhaltsverzeichnis

    • Backticks
    • String-Begrenzer
    • Semikolon
    • Groß-/Kleinschreibung
    • Mehrzeilige Schreibweise
    • Fazit


    Backticks
    Backticks sind zwar umstritten, sind aber im Endeffekt eine Absicherung. Ein Backtick (`) wird verwendet, um von MySQL-Keywords zu unterscheiden. Es kann demnach sein, dass wenn man bekannte Keywords aus MySQL Queries als zum Beispiel Tabellennamen, Feldnamen usw. verwendet, dass es bei der Ausführung des Queries zu einem Syntaxfehler kommt. Kurzes Beispiel:

    SQL
    SELECT alter FROM table WHERE show = 3;


    Es würde ein Syntaxfehler generiert werden, da 'show', 'alter' und evt. 'table' Keywords von MySQL sind und demnach falsch interpretiert werden würden. Abhilfe leisten Backticks, womit man den Tabellen- bzw. Feldnamen einschließt und eine Absicherung erhält. Ein richtiges Beispiel wäre:


    SQL
    SELECT `alter` FROM `table` WHERE `show` = 3;



    String-Begrenzer
    Zwar ist mir aufgefallen, dass viele bereits String-Begrenzer (') verwenden, jedoch meist falsch. String-Begrenzer begrenzen, wie der Name bereits sagt, Strings. Als oftmaliger Fehler ist mir aufgefallen, dass Leute Integer, Floats, ... mit String-Begrenzern verpacken. Strings werden mit String-Begrenzern eingeschlossen, um eine Zeichenkette als Element darzustellen. Dabei werden die Rahmenbedingungen für das erfolgreiche Einfügen von Strings in einen Query hergestellt. Dies hat nichts mit dem vorigen Escapen des Strings zur weiteren Vorbeugung gegen SQL Injections zu tun. Auf dieses Thema wird in diesem Tutorial nicht weiter eigegangen, es wird aber tunlichst empfohlen, dieses Thema zu bearbeiten um weitere Sicherheitslücken zu schließen. Ein Beispiel, welches zu einem Syntaxfehler führt:


    SQL
    INSERT INTO `table` (`field1`, `field2`) VALUES (2, Markus ist ein neues Mitglied);



    Ein Beispiel, das String-Begrenzer falsch anwendet:


    SQL
    INSERT INTO `table` (`field1`, `field2`) VALUES ('2', 'Markus ist ein neues Mitglied');


    Ein Beispiel, das String-Begrenzer konsequent und richtig anwendet:


    SQL
    INSERT INTO `table` (`field1`, `field2`) VALUES (2, 'Markus ist ein neues Mitglied');



    Semikolon
    Zwar spielt das Semikolon am Ende eines Querys meist eine optionale Rolle, doch prägt es guten coding Stil. In den meisten Sprachen wie Pawno, PHP usw. ist das Semikolon optional, da der auszuführende Query bereits durch bspw. Hochkommata begrenzt ist. Trotzdem ist eine optionale Maßnahme oftmals hilfreich. Als weiteres Beispiel sind MySQL Queries anzusprechen, die auf DOS Ebene ausgeführt werden. Diese benötigen ein Semikolon explizit, dass das Ende des Querys erkannt und der Query selbst ausgeführt werden kann. Wieder ein Negativ- und Positivbeispiel:


    SQL
    SELECT `field1` FROM `table`


    SQL
    SELECT `field1` FROM `table`;



    Groß-/Kleinschreibung
    Die Verwendung der richtigen Zeichen an richtigen Orten zum richtigen Zweck sei demnach geklärt. Treten wir über zur Formatierung des kompletten Queries. Hierbei fällt mir oftmals auf, dass die Groß- und Kleinschreibung oftmals nicht eingehalten wird und zu Problemen führen kann. Die Groß- und Kleinschreibung spielt bei Windows und Mac keine Rolle, jedoch bei UNIX Systemen. Es wird also empfohlen, 'case sensitivity' zu beachten und zu befolgen, denn vor allem hier bei SA:MP ist ein Distributionswechsel nach zum Beispiel Linux nicht undenkbar. Man beachte also schon von Beginn an die Groß- und Kleinschreibung der Queries, um späteren Problemen vorzubeugen. Weiterhin fördert die Groß- und Kleinschreibung die Leserlichkeit der Queries. Es ist anzumerken, dass bei Tabellen- und Feldnamen die Groß- und Kleinschreibung keine Rolle spielt, aber bei UNIX Systemen die Groß- und Kleinschreibung von Keywords und bei allen Distributionen die Groß- und Kleinschreibung bei Suchvorgängen (Ausnahmen bei bestimmten Tabelleneinstellungen). Ein Negativbeispiel mit anschließendem Positivbeispiel folgt:


    SQL
    select `name` from `table` where `age` = 3;


    SQL
    SELECT `name` FROM `table` WHERE `age` = 3;



    Mehrzeilige Schreibweise
    Die mehrzeilige Schreibweise von Queries ist vor allem bei langen Queries zur Förderung der Leserlichkeit zu empfehlen, jedoch macht es beim Syntax keinen Unterschied und ist daher lediglich empfohlen. Bei der mehrzeiligen Schreibweise in Pawno ist die Verwendung von Backslashes vorteilhaft, um das wiederholende Aufrufen einer Funktion zu verhindern. Ein Beispiel:


    SQL
    SELECT `field1`, `field2`, `field3`\
    FROM `table`\
    WHERE `field1` = 1 AND `field2` = 3\
    LIMIT 20;



    Fazit
    Abschließend lässt sich also feststellen, dass eine ordentliche Schreibweise von Queries nicht nur die Leserlichkeit verbessert, sondern auch Syntaxfehlern und möglichen Sicherheitslücken vorbeugt. Es wird also empfohlen, auch für die spätere Weiterverwendung des Programmierten, die richtige Schreibweise von Queries anzuwenden und tunlichst zu befolgen. Anmerkungen und Anregungen zur Verbesserung des Tutorials sind willkommen, aber auch Feedbacks und Fragen über dieses Thema.

  • Jetzt könnte man noch daran appelieren, dass du jeweils das Semikolon vergessen hast bei den einzelnen Beispielen , welche auch seine ordnung hat und zwar signalisiert dies MySQL das der eingegebene SQL Befehl beendet ist und nachfolgende Befehle haben keine direkte Einwirkung auf den abgeschlossenen Befehl sondern werden nachfolgend abgeschickt

    Einmal editiert, zuletzt von IPrototypeI ()

  • Jetzt könnte man noch daran appelieren, dass du jeweils das Semikolon vergessen hast bei den einzelnen Beispielen , welche auch seine ordnung hat und zwar signalisiert dies MySQL das das Query
    fertig ist und nachfolgende Befehl werden nicht mehr ausgeführt.


    Gute Anmerkung! Habe extra eine Passage zum Semikolon hinzugefügt und die Queries um je ein Semikolon erweitert.

  • Es gibt btw auch einen MySQL-BBCode, damit werden die entsprechenden Keywords auch richtig gehighlighted.
    Slash™:
    Nicht nur Theoretisch. Immer wenn du mit Variablen arbeitest solltest du escapen, da können backticks nicht vor schützen.


    Nehmen wir an du hast folgendes:

    SQL
    SELECT * FROM `user` WHERE `name` = %s

    Und bei %s wird entsprechend z.b der Name eines Benutzer eingegeben. Dieser Name kommt nun direkt von der Eingabe des Benutzers ohne vorher escaped zu werden, daraus entsteht im Idealfall dann:

    SQL
    SELECT * FROM `user` WHERE `name` = maddin


    Jetzt geb ich aber anstatt meinem Namen, einfach

    Code
    maddin;DROP TABLE user

    ein, und es entsteht folgendes:

    SQL
    SELECT * FROM `user` WHERE `name` = maddin;DROP TABLE `user`

    Und schon hast du ein Problem, denn ich habe gerade alle deine Nutzer gelöscht.


    Die oben angesprochenen String-Begrenzer würde daraus allerdings folgendes machen:

    SQL
    SELECT * FROM `user` WHERE `name` = 'maddin;DROP TABLE `user`'

    Und somit weiss MySQL dass alles innerhalb der ' ' ein String ist, und somit nicht ausgeführt werden soll.


    Jetzt kann ich aber wiederum

    Code
    maddin';DROP TABLE `user`;SELECT * FROM irgendwas WHERE 'x' = 'y

    eingeben, und erzeuge damit folgendes:

    SQL
    SELECT * FROM `user` WHERE `name` = 'maddin';DROP TABLE `user`;SELECT * FROM irgendwas WHERE 'x' = 'y'

    Wie du siehst, wurden trotzdem 3 Querys erzeugt, und deine Nutzer sind wieder weg.


    Also: Die richtige Syntax zu nutzen ist gut, schützt aber nicht vor Angriffen. Deshalb immer escapen.

  • Es gibt btw auch einen MySQL-BBCode, damit werden die entsprechenden Keywords auch richtig gehighlighted.


    Guter Einwand, habe es direkt verbessert.