Ankündigung

Einklappen
Keine Ankündigung bisher.

RegEx für WHERE-Statement

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • RegEx für WHERE-Statement

    Hallo liebe Foren-Gemeinde,

    ich bin im Moment am Entwickeln einer Plattform welche strikt nach dem Client-Server-Prinzip getrennt aufgebaut ist.

    Nun muss ich eine MySQL-Query bilden in welcher der Nutzer das WHERE-Statement frei definieren können soll. Der Rest wird vom System ergänzt und ist somit sicher.

    Bevor jetzt jemand aufschreit: Ja, ich weiß, dass man den Nutzer eigentlich so stark wie möglich "kastrieren" sollte, kann es in diesem Fall aber leider nicht anders lösen.

    Hat jemand eine Idee, wie ich das mit RegEx hinbekomme?
    Es sollen ausdrücklich KEINE Sub-Queries oder sonstige komplizierte Gebilde erlaubt sein. Nur "normale" AND/OR-Verknüpfungen!

    Danke schonmal im Voraus für eure Unterstützung,
    euer DP

  • #2
    Nun muss ich eine MySQL-Query bilden in welcher der Nutzer das WHERE-Statement frei definieren können soll.
    Bitte erst mal beschreiben, wie sie das tun können.

    Kommentar


    • #3
      Durch ein per GET oder POST übermitteltes XML-Dokument.
      Also einen String.

      Dieser soll dann (zwecks Injection-Abwehr) geprüft und wenn valide in die Query eingefügt werden.

      Grüße,
      DP

      Kommentar


      • #4
        Dann solltest Du die Operatoren durch die XML-Struktur abbilden. Ich denke, das wäre schon mal eine brauchbare Basis.

        Kommentar


        • #5
          Das nimmt mir aber nicht die Arbeit des Validierens ab

          Außerdem verlagere ich dadurch das Parsen nur auf den "clientseitigen" Teil des Clients (hört sich doof an ) und stehe wieder an genau dem selben Punkt.
          Im Falle eines Angriffs muss der "serverseitige" Teil des Clients aber dennoch einspringen, da auf eine (manipulierbare) Ausgabe des "clientseitigen" Teils des Clients kein Verlass ist
          Klingt komplizierter, als es gemeint ist

          Btw: Das mit dem XML war nur ein Beispiel. Die Anfragen kommen auf verschiedenen Wegen beim Server an. Je nach verwendetem Client.
          Die einzige Konstante ist, dass sie immer als String in der Form
          Code:
          ((abc='def') OR (ghi LIKE jkl))
          etc. vorliegen - sofern valide.

          Grüße,
          DP

          Kommentar


          • #6
            Die einzige Konstante ist, dass sie immer als String in der Form
            Code:

            ((abc='def') OR (ghi LIKE jkl))

            etc. vorliegen.
            Sorry, aber das ist eine komplett andere Aussage als vorher. Und genau deshalb habe ich gefragt. Von clientseitiger Validierung habe ich kein Wort gesagt und, doch, könnte ich die Operatoren aus dem Teststring ausschließen, wäre das ein gewaltiger Unterschied.

            Kommentar


            • #7
              Ok, nochmal von vorne:

              Ich habe zum einen das eigentliche System (Server), welches die Daten als String vorgesetzt bekommt.

              Dann habe ich den serverseitigen Teil des Clients, welcher sich um die Auslieferung des der Daten und beim Browser-Client um die Ausgabe des HTML kümmert.

              Und zuletzt habe ich noch den clienteitigen Teil des Clients, also PC/Mac/Linux/...-Application oder Browser oder anderer Server, oder internes Modul des Servers, ...

              Je nachdem, wo die Anfrage herkommt, liegt sie anders vor und durchläuft andere Prozesse.
              Am Ende des Tages liegt sie aber als String beim Server vor, soll validiert und dann in die SQL-Query eingefügt werden.

              Ich hoffe, das war jetzt verständlicher


              Im Gegensatz zur restlichen SQL-Grammatik ist das WHERE-Statement doch eigentlich relativ "unflexibel" und klar definiert!? (Quelle: http://www.w3schools.com/sql/sql_where.asp)

              Daraus müsste sich doch ein RegEx basteln lassen.
              Ich stehe selber mit RegEx nur leider auf Kriegsfuß, daher die Bitte um Hilfe ...

              Grüße,
              DP

              Kommentar


              • #8
                Du solltest weniger w3schools lesen und mehr echte Dokumentation https://dev.mysql.com/doc/refman/5.5/en/select.html https://dev.mysql.com/doc/refman/5.5...pressions.html

                Ich stehe selber mit RegEx nur leider auf Kriegsfuß, daher die Bitte um Hilfe ...
                Dann können wir den Thread hier eigentlich beenden, denn trivial ist das schon mal nicht.

                Kommentar


                • #9
                  Zitat von nikosch Beitrag anzeigen
                  Du solltest weniger w3schools lesen
                  War auch nur ein Beispiel

                  Zitat von nikosch Beitrag anzeigen
                  denn trivial ist das schon mal nicht.
                  Hatte ich auch nicht behauptet.
                  Ich komme mit RegEx zurecht, bin aber nicht der große Guru.

                  DP

                  Kommentar


                  • #10
                    Folgende Idee müsste doch eigentlich ihren Zweck erfüllen:

                    Da die Datenbank selbst auf eine valide Syntax achtet, muss ich das ja nicht nochmal machen. Es sollte doch eigentlich genügen, wenn ich einfach nur prüfe, ob sich im String ein im WHERE-Statement nicht gültiges Schlüsselwort befindet.
                    Spricht, ich filtere alle SELECTs, FROMs, INSERTs, DROPs &Co. raus und lasse nur alphanumerische Zeichen, <, >, =, (, ), _, +, /, *, LEERZEICHEN und ", ', - EINMAL IN FOLGE zu.

                    Ist sicher noch keine perfekte Idee, aber ein Ansatz!? Was meint ihr?

                    Grüße,
                    DP

                    Kommentar


                    • #11
                      Was ist, wenn ich

                      PHP-Code:
                      " ... WHERE tbl.field LIKE '%what do you need from the store?' OR tbl.field2 = 'drop the attitude'" 
                      ausführen will? Dann filterst du mir Daten aus meinen Strings raus, die meine Abfrage aber braucht. Und die Syntax wird dadurch nicht zerstört, meine Abfrage funktioniert einfach nicht.

                      Kommentar


                      • #12
                        Hmmm, auch wahr
                        Andere Vorschläge?

                        DP

                        Kommentar


                        • #13
                          Ja, lass die Finger von Dingen, die Du nicht beherrschst.

                          Kommentar


                          • #14
                            Zitat von nikosch Beitrag anzeigen
                            Ja, lass die Finger von Dingen, die Du nicht beherrschst.
                            HERZLICHEN DANK für diesen überaus hilfreichen Rat!

                            Kommentar


                            • #15
                              Beim Thema Datenbanksicherheit kann ich keinen anderen Rat geben. Hilfreich wäre, dass Du Programmieren lernst, bevor Du Dich an heiße Eisen wagst.
                              Da die Datenbank selbst auf eine valide Syntax achtet, muss ich das ja nicht nochmal machen. Es sollte doch eigentlich genügen, wenn ich einfach nur prüfe, ob sich im String ein im WHERE-Statement nicht gültiges Schlüsselwort befindet.
                              Spricht, ich filtere alle SELECTs, FROMs, INSERTs, DROPs &Co. raus und lasse nur alphanumerische Zeichen, <, >, =, (, ), _, +, /, *, LEERZEICHEN und ", ', - EINMAL IN FOLGE zu.
                              Was meint ihr?
                              Dass das Käse ist. Und die Idee alleine halt nicht reicht.

                              Kommentar

                              Lädt...
                              X