MySQL Klasse "absichern"

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

  • MySQL Klasse "absichern"

    Hallo zusammen!

    Ich muss so eine MySQL-Klasse für PHP benutzen. Hier hab ich mal eine Funktion davon:
    PHP-Code:
    function select($db$table$fields="*"$where=""$other="") {
          
    // load the settings
          
    require("settings.inc.php");
          
          
    // connect to server
          
    $link            =    mysql_connect($settings['mysql']['host'], 
    $settings['mysql']['user'],
    $settings['mysql']['passwd']);
          if(!
    $link) { // can't connect to the db
            
    return mysql_error();
          }
          
          
    // select the db
          
    $selected_db    =    mysql_select_db($db$link);
          if(!
    $selected_db) { // can't select the db
            
    return mysql_error($link);
          }
          
          
    // create the query
          
    if($where!="") {
            
    $where        =    " WHERE " $where;
          }
          if(
    $other!="") {
            
    $other        =    " " $other;
          }
          
    $query            =    "SELECT " $fields " FROM " 
    $table $where $other;
          
          
    // execute the query
          
    $result            =    mysql_query($query$link);
          if(!
    $result) {
            return 
    mysql_error($link);
          }
          
          
    // give the result back
          
    return $result;
      } 
    Dafür mal ein kleiner Beispielinput:
    PHP-Code:
    $mysql->select('db','mytable','userID','userName="Onyx"'); 
    oder
    PHP-Code:
    $mysql->select('db',"mytable",'userID',"userName='Onyx'"); 
    Existiert also alles.

    Gibt es eine Möglichkeit, die MySQL-Klasse so zu manipulieren, dass ich etwas wie mysql_real_escape_string oder stripshales oder htmlentities benutzen kann?

    Die Parameter der Funktion lassen sich leider nicht abändern (die werden halt bereits so benutzt).
    Hat jemand eine Idee/einen Vorschlag? Bin froh um alles dergleichen! Auch wenn es irgend eine ultra komplizierte Regex ist

    Danke im Voraus und MfG
    Onyxagargaryll
    Zuletzt geändert von Onyxagargaryll; 15.05.2008, 11:47.

  • #2
    Hi,

    erstmal eine Bitte: Code umbrechen.

    Dann:

    "Gibt es eine Möglichkeit, die MySQL-Klasse so zu manipulieren, dass ich etwas wie mysql_real_escape_string oder stripshales oder htmlentities benutzen kann?" < Sinn?

    Ansich kannst du wo du willst diese Funktionen aufrufen.
    Normal macht man das bei allen Variablen, die vom User beeinflusst werden können... für den query -> mysql_real_escape_string

    mfg

    Kommentar


    • #3
      Hi Blackgreetz

      Code habe ich umgebrochen.
      Für das Zitat von mir gibts die "Zitat"-Funktion.

      Z.B. wird die "Where" genau so übermittelt:
      PHP-Code:
      'userName="Onyx"' 
      .. so sieht der String aus. Was vorher geschieht (also das Zusammensetzen mit "Onyx") kann ich nicht beeinflussen.
      Also muss ich in dieser Funktion irgendwie mysql_real_escape_string einbauen.

      Würde ein mysql_real_escape_string bei der query nicht darauf hinauslaufen, dass er den gesamten Querystring escaped?
      Also die Anführungszeichen um Onyx sowie die Zeichen die evtl. darin enthalten wären. Das gäbe dann wohl ein ziemliches Durcheinander oO

      MfG
      Onyx

      Kommentar


      • #4
        'userName="Onyx"'
        am = splitten, dann die äußeren " wegnehmen und das was übrigbleibt in mysql_real_escape_string() reingeben und dann den string wieder zusammenbauen
        it's not a bug,
        it's a feature!

        Kommentar


        • #5
          Ah jo ^^ ok, so mach ichs.
          Weisst du grad wie ich nur die äusseren " wegnehme? (Kann leider (noch) kein Regex )
          Und nein ich werde nicht böse wenn du mir 'n google-link mit "Regex Tutorial" postest :P Das würden 99% der Mods machen, also nur zu ^^


          Danke für eure Hilfe

          MfG
          Onyx

          Kommentar


          • #6
            Original geschrieben von Onyxagargaryll
            Für das Zitat von mir gibts die "Zitat"-Funktion.
            Bitte.

            Z.B. wird die "Where" genau so übermittelt:
            PHP-Code:
            'userName="Onyx"' 
            .. so sieht der String aus. Was vorher geschieht (also das Zusammensetzen mit "Onyx") kann ich nicht beeinflussen.
            Also muss ich in dieser Funktion irgendwie mysql_real_escape_string einbauen.
            Siehe XGremliN..
            ggf. mit einer Schleife, falls auch mal mehrere Wete abgefragt werden..was allerdings durch die Verknüpfung dann wieder etwas schwieriger werden würde..

            Würde ein mysql_real_escape_string bei der query nicht darauf hinauslaufen, dass er den gesamten Querystring escaped?
            Also die Anführungszeichen um Onyx sowie die Zeichen die evtl. darin enthalten wären. Das gäbe dann wohl ein ziemliches Durcheinander oO
            'Für den Query' nicht 'Auf den Query'
            Meinte damit natürlich die einzelnen Variablen, die für den Query später eine Rolle spielen.. und bei querys (ies?) nutzt man gewöhnlich die Funktion statt den anderen beiden

            mfg
            Edit:

            Für das Filtern: http://regexp-evaluator.de/evaluator...5e86/#ergebnis
            Obwohl regex fast zu viel ist..
            Zuletzt geändert von Blackgreetz; 15.05.2008, 12:09.

            Kommentar


            • #7
              Cooler Link, danke

              Ne das mit der Schlaufe passt schon, muss ich fast machen...

              Also danke nochmals euch beiden für eure Hilfe


              MfG
              Onyx


              PS: Lösung gefunden -> *Closed*

              Kommentar


              • #8
                Das ist nicht die Lösung, deine Query kann bereits durch eine SQL-Injection infiziert sein. Ein simples Trennen, escapen und zusammenbauen reicht nicht aus, da es sich bei einem Where-Statement nicht nur um ausdrücke a la
                Code:
                foo="bar"
                handeln muss. Was machst du denn bei
                Code:
                ( foo=1 and bar="bla" ) or ( foo>100 and bar="xyz" )
                zum Beispiel? Du kannst nicht mehr erkennen, was jetzt gewollt ist:
                PHP-Code:
                // Keine Injection:
                $_POST['bla1'] = 'foo';
                $_POST['bla2'] = 'xyz';
                $where '( foo=1 and bar="'.$_POST['bla1'].'" )
                  or ( foo>100 and bar="'
                .$_POST['bla2'].'" )';
                // ODER Injection:
                $_POST['bla'] = 'bla" ) or ( foo>100 and bar="xyz';
                $where '( foo=1 and bar="'.$_POST['bla'].'" )'
                Das Escapen der Benutzereingaben gehört vor den Aufruf der select-Methode, an der Stelle, an der das WHERE-Statement erstellt wird. Alles andere ist Blödsinn!

                Kommentar


                • #9
                  Wirklich? Du hast in weniger als einer Stunde eine Möglichkeit gefunden, alle Literale aus einer WHERE-Klausel zu fischen? Das ist unglaublich, wenn man bedenkt wie komplex so ein WHERE sein kann.

                  WHERE foo="foo" OR (`bar`!='"bar"bar' AND baz NOT IN (SELECT ... WHERE a=b+c AND "d='e'"='f' OR `f` LIKE '%*foo"') ...

                  Tut mir leid, dein Vorhaben ist überhaupt nicht machbar. Oder zumindest wäre es weniger Aufwand und auch sicherer, alle Aufrufe der Funktion zu suchen und die Werte dort vorher zu escapen.
                  Zuletzt geändert von onemorenerd; 15.05.2008, 12:32.

                  Kommentar


                  • #10
                    OffTopic:
                    @onemorenerd: Schneller

                    Kommentar


                    • #11
                      Das wären mehr als ich zählen kann

                      Ich werd das mal beim Team zur Ansprache bringen :P Am besten ich fang schonmal an


                      Danke für die Hilfe, MfG und schönen Tag wünscht euch allen
                      Onyxagargaryll
                      Zuletzt geändert von Onyxagargaryll; 15.05.2008, 13:39.

                      Kommentar

                      Lädt...
                      X