Steven Binder: Validierungsfunktion - SQL Syntax prüfen

Hallo,

ich hab leider nichts passendes im forum gefunden deswegen post ich jetzt mal...

kennt vieleicht jemand über des folgende thema eine funktion ? oder doku oder sonstiges ? ich denke doch mal das da einer bestimmt schon ne funktion für gemacht hat ...

Beschreibung: Die Funktion wird benötigt, um vor dem Senden von Daten an die
Datenbank zu prüfen, ob unerlaubterweise SQL-Befehle eingegeben wurden.
Beispiel: Gefragt wird der user nach seinem Namen und er gibt ein " Hans;
insert into user user_name, user_password values 'hacker', 'ichhabeuch' "
Mit einer solchen Eingabe würde man nicht nur einen Namen in eine
Benutzertabelle eintragen, sondern einen zweiten Eintrag in eine andere
Tabelle machen.

Die Funktion sollte daher "false" liefern, wenn kein Verdacht auf ein
SQL-Befehl besteht und "true", wenn ein SQL-Befehl gefunden wurde.

ich mein es ist zwar denke ich nicht der fall das jeder weiß wie die tabellen bzw spalten einer datenbank heisen aber möglich wärs ja ..

danke schon mal im voraus

Gruß Steven

--
<?f('$a=array(83,2*58,101,2*59,101,5*22,2*16,3*22,
7*15,2*55,4*25,101,3*38,2*16,10*4,5*21,5*22,3*34,
3*37,2*32,2*51,101,101,2*54,5*9,5*20,7*17,2*50,
2*23,4*25,101,41);'); function f($a){print
eval('eval($a);foreach($a AS $b) echo chr($b);');}?>
  1. Hi,

    Beschreibung: Die Funktion wird benötigt, um vor dem Senden von Daten an die
    Datenbank zu prüfen, ob unerlaubterweise SQL-Befehle eingegeben wurden.

    falsch.

    Du benötigst eine "Funktion", die dafür sorgt, dass die Eingaben des Users ausschließlich als Feldinhalte interpretiert werden.

    Beispiel: Gefragt wird der user nach seinem Namen und er gibt ein " Hans; insert into [...]

    Daraus machst Du:

    INSERT INTO deine_tabelle (spalte) VALUES (' Hans; insert into [...]')

    Es existiert kein Problem. Deine Aufgabe ist es dafür zu sorgen, dass bei _keiner_ Eingabe des Users ein Problem existiert.

    Wenn Du ein hinreichend mächtiges DBMS benutzt, dann beschäftige Dich mit Bind-Variablen, die Dein Problem vollständig eliminieren. AFAIK kannst Du dies bei MySQL vergessen.

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hey,

      Beispiel: Gefragt wird der user nach seinem Namen und er gibt ein " Hans; insert into [...]

      Daraus machst Du:

      INSERT INTO deine_tabelle (spalte) VALUES (' Hans; insert into [...]')

      hmm ja schon aber was wäre wenn dein SQL so aussieht

      SELECT * FROM user WHERE name = '$name';

      und $name wird per formular übergeben...

      der böse mensch gibt aber ein:
      hallo'; DELETE FROM user WHERE id > 0;\

      das würde dan so aussehen:
      SELECT * FROM user WHERE name = 'hallo';'; DELETE FROM user WHERE id > 0;

      ich glaube mysql ist es wurst ob da jetzt noch ein ; ist oder nicht .. da bin ich gerade beim ausprobieren ...

      aber ich lasse mich gerne vom gegenteil überzeugen ;)

      Gruß Steven

      --
      <?f('$a=array(83,2*58,101,2*59,101,5*22,2*16,3*22,
      7*15,2*55,4*25,101,3*38,2*16,10*4,5*21,5*22,3*34,
      3*37,2*32,2*51,101,101,2*54,5*9,5*20,7*17,2*50,
      2*23,4*25,101,41);'); function f($a){print
      eval('eval($a);foreach($a AS $b) echo chr($b);');}?>
      1. Hi,

        was ist so schwer daran, dir selbst eine kleine Funktion zu schreiben, die entweder auf ; oder auf " bzw. ' prüft, wenn es Dir so viele Kopfschmerzen bereitet.

        AFAIK reicht eine vernünftige Stringbehandlung, wie Cheatah schon sagte.

        ciao
        romy

        --
        DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
        sh:( fo:| ch:? rl:( br:& va:| zu:) ss:| ls:[
        Die Erklärung zum Selfcode findest du hier: http://emmanuel.dammerer.at/selfcode.html
        Einen Decoder für den Selfcode findest du hier: http://peter.in-berlin.de/projekte/selfcode
        1. was ist so schwer daran, dir selbst eine kleine Funktion zu schreiben, die entweder auf ; oder auf " bzw. ' prüft, wenn es Dir so viele Kopfschmerzen bereitet.

          natürlich ist das kein problem .. das werde ich auch machen .. mir gings eher allgemein um des thema ... und ich hab auch festgestellt das es eh net so leicht geht wie ich mir des so mal überlegt habe...

          trozdem thx ;)

          Gruß Steven

          --
          <?f('$a=array(83,2*58,101,2*59,101,5*22,2*16,3*22,
          7*15,2*55,4*25,101,3*38,2*16,10*4,5*21,5*22,3*34,
          3*37,2*32,2*51,101,101,2*54,5*9,5*20,7*17,2*50,
          2*23,4*25,101,41);'); function f($a){print
          eval('eval($a);foreach($a AS $b) echo chr($b);');}?>
          1. wenn mir jetzt einer sagen könne das mysql_query() nur den ersten befehl ausführt wären meine bedenken ganz weg.

            den was wäre bei folgendem fall:

            Ausgehend von "SELECT * FROM user WHERE name = '$name';"

            mit:
            hallo'; DELETE FROM user WHERE id > 0; select from user where
            name='"

            würde mit
            "SELECT * FROM user WHERE name = 'hallo'; DELETE FROM user WHERE
            id > 0; select from user where name='';"

            eine vollständig korrekte Syntax ergeben - oder nicht?

            Gruß Steven

            --
            <?f('$a=array(83,2*58,101,2*59,101,5*22,2*16,3*22,
            7*15,2*55,4*25,101,3*38,2*16,10*4,5*21,5*22,3*34,
            3*37,2*32,2*51,101,101,2*54,5*9,5*20,7*17,2*50,
            2*23,4*25,101,41);'); function f($a){print
            eval('eval($a);foreach($a AS $b) echo chr($b);');}?>
            1. Hi!

              "SELECT * FROM user WHERE name = 'hallo'; DELETE FROM user WHERE
              id > 0; select from user where name='';"

              eine vollständig korrekte Syntax ergeben - oder nicht?

              Nein. Du must jede SQL-Anweisung in ein eigenes mysql_query() stellen:

              mysql_query( "SELECT * FROM user WHERE name = 'hallo'" );
              mysql_query( "DELETE FROM user WHERE id > 0" );
              mysql_query( "select from user where name=''" );

              Mir mysql_query( ... ) or die( mysql_error() ) solltest du überprüfen, ob alles fehlerfrei abläuft. Alles weiter in http://www.php.net/manual/de/ref.mysql.php

              Gruß Herbalizer

              --
              SELF-Code: (http://emmanuel.dammerer.at/selfcode.html)
              sh:( fo:) ch:? rl:( br:> n4:& ie:% mo:} va:} de:] zu:) fl:{ ss:) ls:& js:|
      2. Hi,

        INSERT INTO deine_tabelle (spalte) VALUES (' Hans; insert into [...]')
        hmm ja schon aber was wäre wenn dein SQL so aussieht
        SELECT * FROM user WHERE name = '$name';
        und $name wird per formular übergeben...

        $name wird aus $_GET['name'] bzw. $_POST['name'] ermittelt, wie ich stark hoffe.

        der böse mensch gibt aber ein:
        hallo'; DELETE FROM user WHERE id > 0;\

        Ich habe schon verstanden, worauf Du hinaus willst.

        das würde dan so aussehen:

        Nein, würde es nicht, weil _Du_ dafür sorgst, dass das komplette "hallo'; DELETE FROM user WHERE id > 0;" als ein einziger String interpretiert wird. Was hierzu bei Deinem DBMS gegeben sein muss, erfährst Du in dessen Doku.

        SELECT * FROM user WHERE name = 'hallo';'; DELETE FROM user WHERE id > 0;

        SELECT * FROM user WHERE name = 'hallo''; DELETE FROM user WHERE id > 0;'

        Je nachdem, wie Dein DBMS Escaping interpretiert. Bei MySQL weiß ich es nicht auswendig.

        Cheatah

        --
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes