Jörg: Warum läuft die Query nicht?

Hallo,

ich erhalte einen mysql-error in meinen Logfiles angezeigt. Wenn ich die Query aber ausgeben lasse und über phpmyAdmin ausführe, ist die Query korrekt.

Laut Logfile übergibt mein Script aber auch eine leicht modifizierte Query.

Original:

SELECT
t.Status AS Datum,
m.Kundennummer AS Kun_Nr,
m.Firma AS Kunde,
usw.

Errorlog:

PHP Fatal error:  Uncaught mysqli_sql_exception: You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use
near '\\nt.Status AS Datum,\\nm.Kundennummer AS Kun_Nr,\\nm.Firma AS' at line 1 

Was läuft hier falsch?

Jörg

  1. Hallo Jörg,

    Was läuft hier falsch?

    Was steht hinter "Kunde, " ?

    Eine weitere Spalte, die SELECTed werden soll? Oder FROM?

    Was mich auch irritiert, ist das \\n - so als stünde da der Backslash im Querytext.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Hallo Rolf,

      Was steht hinter "Kunde, " ?

      Eine weitere Spalte, die SELECTed werden soll? Oder FROM?

      Nein, weitere Spalten.
      Das Kuriose: Wenn ich alle zu selectenden Spalten nahtlos aneinander reihe, wechselt die Fehlermeldung dann zu: ... near '\\nFROM

      Die Query geht zu einem FPDF-AddOn. Aber auch wenn ich die Query kurz vor dem Ausführen nochmal vom AddOn ausgeben lasse, erhalte ich eine völlig normal aussehende Query, die im phpmyAdmin eine ganz normale Ergenbnismende ausgibt.

      Was mich auch irritiert, ist das \\n - so als stünde da der Backslash im Querytext.

      Ob der Editor da irgendwas reingeschmuggelt hat?

      Edit: Habe gerade mal alle Zeilenumbrüche aus der Query enfernt, aber die Fehlermeldung bleibt erhalten. Woher nimmt die Fehlermeldung denn die \n, wenn ich selber in der Query gar keine mehr drin habe?

      Jörg

      1. Hallo Jörg,

        jetzt bin ich von hier aus ratlos. Bist Du ganz sicher, dass kein Zeilenumbruch mehr drin ist, auch nicht vor dem FROM?

        Oder geht das Addon her und formatiert die Query zuerst mal, bevor es dann die Zeilenumbrüche escaped? Wäre ein blöder Bug und eher unwahrscheinlich.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Hallo Rolf,

          jetzt bin ich von hier aus ratlos. Bist Du ganz sicher, dass kein Zeilenumbruch mehr drin ist, auch nicht vor dem FROM?

          Oder geht das Addon her und formatiert die Query zuerst mal, bevor es dann die Zeilenumbrüche escaped? Wäre ein blöder Bug und eher unwahrscheinlich.

          function query($query){
             // $query = mysqli_real_escape_string($this->conn, $query);
          	$this->results = mysqli_query($this->conn, $query);
          	$this->numFields = mysqli_num_fields($this->results);
          }
          

          Das AddOn nutzt vorher noch mysqli_real_escape_string, welches ich jetzt mal auskommentiert habe. Jetzt wird keijn sql-Fehler mehr angemeckert, dafür kann jetzt die Font-Datei nicht inkludiert werden. FRage mich, warum das alles unter php7 noch funktioniert hat.

          Jörg

          1. Hallo Jörg,

            die ganze Query zu escapen ist definitiv ein Programmierfehler und kann nie richtig gewesen sein. Man escaped nur die Daten, die man in die Query injiziert. Andernfalls escapest Du ggf. Anführungszeichen, die zur Query-Syntax gehören. Oder auch Zeilenumbrüche im Query-Text.

            Der Font ist jetzt aber eine andere Baustelle, oder?

            Rolf

            --
            sumpsi - posui - obstruxi
            1. Moin Rolf und Jörg,

              die ganze Query zu escapen ist definitiv ein Programmierfehler und kann nie richtig gewesen sein.

              mich würde jetzt mal interessieren, wie man auf die Idee kommt, die gesamte Query escapen zu wollen …

              Viele Grüße
              Robert

            2. Hallo Rolf,

              die ganze Query zu escapen ist definitiv ein Programmierfehler und kann nie richtig gewesen sein. Man escaped nur die Daten, die man in die Query injiziert. Andernfalls escapest Du ggf. Anführungszeichen, die zur Query-Syntax gehören. Oder auch Zeilenumbrüche im Query-Text.

              Ist wie gesagt nicht mein Script, sondern ein FPDF AddOn, in das ich grad zum ersten mal herein geschaut habe, weils unter php7 einfach lief.

              Der Font ist jetzt aber eine andere Baustelle, oder?

              Ja, scheint so.
              Und auch hierfür habe ich ansich keinen Hinweis, warum der Font nicht eingebunden wird.
              Deutet normalerweise auf eine fehlende Datei hin oder auf unzureichende Rechte. Habe beides geprüft und daran liegts nicht.

              Jörg

              1. Hallo Rolf,

                die ganze Query zu escapen ist definitiv ein Programmierfehler und kann nie richtig gewesen sein. Man escaped nur die Daten, die man in die Query injiziert. Andernfalls escapest Du ggf. Anführungszeichen, die zur Query-Syntax gehören. Oder auch Zeilenumbrüche im Query-Text.

                Ist wie gesagt nicht mein Script, sondern ein FPDF AddOn, in das ich grad zum ersten mal herein geschaut habe, weils unter php7 einfach lief.

                Ich habe an der verlinkten Stelle nach dem von Dir gezeigten „mysqli_real_escape_string“ gesucht - aber nichts gefunden.

                1. Hallo Willi,

                  Ich habe an der verlinkten Stelle nach dm von Dir verwendetem „mysqli_real_escape_string“ gesucht - aber nichts gefunden.

                  Ganz nach unten scrollen, dann auf den einen der beiden Downloads und im gezippten Ordner ist ein script namens mysql_report.php

                  Jörg

                  1. Gut, dass Du verlinkt hast, bei mir steht auf der genannten Seite nirgendwo „Download“. Frisst wohl der Addblocker (Ich weiß nur nicht, welcher, da ich schon im DNS allerhand Mist blockiere).

                    Nach Blick in die Datei mysql_report.php.

                    Alles klar. Auch warum sich die Firma „Bouncing LTD“ nennt.

                    Schmeiß alles weg, was dieses, äh, „Gütesiegel“ trägt.

                    1. Hallo Raketenwilli,

                      View the result <a href="ex21.pdf" target="_blank">here</a>.
                      <h2>Download</h2>
                      <a href="dl.php?id=21&amp;f=zip">ZIP</a> | <a href="dl.php?id=21&amp;f=tgz">TGZ</a>
                      </body>
                      </html>
                      

                      So sieht's im Seitenquelltext aus. Das h2 Element siehst Du auch nicht? Es ist unter dem Sourcecode-Feld.

                      Rolf

                      --
                      sumpsi - posui - obstruxi
                    2. Hallo Willi,

                      Nach Blick in die Datei mysql_report.php.

                      Alles klar. Auch warum sich die Firma „Bouncing LTD“ nennt.

                      Schmeiß alles weg, was dieses, äh, „Gütesiegel“ trägt.

                      Würde ich gerne machen, aber dann muss ich selber ran und für jede "on the fly Query" eigene PDF-Listen erstellen. Das wäre ziemlich viel Arbeit für recht wenig Nutzen (weil es zwar viele Queries sind, sie aber nur alle Jahre mal genutzt werden)

                      Ich glaube, ich kriegs mit einem (mehr oder weniger) eleganten Workaround hin, dass es läuft.

                      Jörg

                      1. Würde ich gerne machen,

                        Schmeiß es weg! Das Zeug ist sogar gefährlich, wie ja gerade das besprochene „Escapen“ der gesamten Query zeigt. Das soll einer SQL-Injection vorbeugen, tut es aber vorliegend nicht!

                        1. Würde ich gerne machen,

                          Schmeiß es weg! Das Zeug ist sogar gefährlich, wie ja gerade das besprochene „Escapen“ der gesamten Query zeigt. Das soll einer SQL-Injection vorbeugen, tut es aber vorliegend nicht!

                          Das ist nicht so dramatisch.
                          Bevor das Script die Query überhaupt "zu Gesicht" bekommt, habe ich die schon diesbzgl. sorgfältigst behandelt.
                          Da würde also gar keine Injection mehr ankommen.

                      2. Hallo Jörg,

                        für jede "on the fly Query"

                        deine User können freie Querys auf deine DB absetzen?!

                        Hoffentlich nur mittels eines restriktiven Query-Generators!!!

                        Da würde also gar keine Injection mehr ankommen.

                        famous last words…

                        Rolf

                        --
                        sumpsi - posui - obstruxi
                        1. Hallo Rolf,

                          deine User können freie Querys auf deine DB absetzen?!

                          Hoffentlich nur mittels eines restriktiven Query-Generators!!!

                          Natürlich.
                          Sie können 4 Optionen hierbei selber auswählen.
                          Den Nutzer, die Leistung, den Start- und den Endzeitpunkt.
                          Es ist also relativ einfach, die hieraus resultierende Query auf Validität zu prüfen. Nutzer und Leistungen sind mir bekannt, können also sehr einfach validiert werden. Bleiben noch die beiden Zeitpunkte, die auch einfach zu validieren sind. Auf den Rest haben die Nutzer dann keinen Einfluss mehr.

                          Jörg

                  2. Hallo Jörg,

                    ja, und dort ist es genau so ein Mist.

                    Aber die Queries, die in diese Funktion hineingegeben werden, enthalten keine Zeichenketten-Konstanten und keine Zeilenumbrüche, sonst würde das dort genauso abrauchen.

                    Rolf

                    --
                    sumpsi - posui - obstruxi