Ankündigung

Einklappen
Keine Ankündigung bisher.

Variablen in Query automatisch escapen

Einklappen

Neue Werbung 2019

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

  • Variablen in Query automatisch escapen

    Hallo,
    bis jetzt musste ich um einen Query zu senden immer folgendes schreiben:
    Code:
    $sql = "SELECT 
    				* 
    			FROM 
    				users
    			WHERE
    				Name = " . escape_var($_POST['name']);
    	
    	$db->send_query($sql);
    Also jede Variable im Query muss mit der Funktion "escape_var()" behandelt werden.

    Gibt es auch eine möglich das meine DB-Klasse automatisch alle Variablen im Query herausfiltert und vor dem senden mit mysql_real_escape_string() escaped?

    MfG
    Alexander

  • #2
    Hallo, naja du kannst dir ein sprintf() "nachprogrammieren".
    Falls du (s)(v)print(f) nicht kennst oder für die, die es nicht kennen:

    PHP-Code:
    <?php
    // print
    print "dieses Forum ist blau und ist fast 5 Jahre alt";
    // funktioniert (fast) genauso wie "echo"


    // printf
    $name "Board";
    $farbe "gelb";
    $alter 18;
    printf("dieses %s ist %s und ist fast %d Jahre alt"$name$farbe$alter);
    // variable Anzahl Parameter möglich, muss jedoch mit der Anzahl Platzhalter übereinstimmen, Ausgabe: sofort


    // sprintf
    $ausgabe sprintf("dieses Forum ist nicht %d Jahre alt"$alter);
    // Ausgabe wird per return zurückgeworfen, aber nicht in den Ausgabepuffer geschrieben wie bei printf (ohne s)
    echo $ausgabe// jetzt aber


    // vprintf
    vprintf("dieses %s ist %s und etwa %d Jahre alt", array($forum$farbe$alter));
    // Ausgabe direkt in den Ausgabepuffer, 2. Parameter ist ein Array, dessen Elemente der Reihenfolge der Platzhalter im Text eingesetzt werden)


    // vsprintf
    // schwer zu erraten, das gleiche in lila
    $ausgabe vsprintf("dieses %s ist %d Jahre alt und manchmal %s", array($forum$alter$farbe));
    echo 
    $ausgabe// Ausgabe erfolgt erst jetzt
    ?>
    Außerdem gibt es die Funktion
    http://de.php.net/func_get_args
    .. die auch für Methoden funktioniert.
    Deine MySQL-Klasse könnte also nun folgende Methode besitzen, die beispielsweise einen Query ausführt und die Treffer als Array zurückliefert:

    PHP-Code:
    <?php
    class MyMySqlClass
    {
      
    // ..
      
    public function fetchAll($sql/*[, mixed arg1[, ..]]*/)
      {
        
    $argv func_get_args();
        if (
    count($argv) > 1) { // offenbar wurde mehr als nur der erste Parameter $sql übergeben
          
    array_shift($argv); // $sql wird von func_get_args() natürlich mitgeliefert, schmeißen wir es weg
          
    $sql vsprintf($sqlarray_map('escape_var'$argv));
        }
        
    $res mysql_query($sql$this->connection);
        
    $hits = array();
        while (
    $dat mysql_fetch_assoc($res$this->fetchType)) {
          
    $hits[] = $dat;
        }
        return 
    $dat;
      }
      
    // ..
    }
    ?>
    Verwendung:
    PHP-Code:
    <?php
    $db 
    = new MyMySqlClass(..);
    foreach (
    $db->execute("SELECT * FROM %s WHERE name = '%s'"$table$nickname) as $hits) {
      echo 
    $hits['firstname'], '
    '
    ;
    }
    ?>
    Welche Funktionen haben wir also verwendet?
    http://de.php.net/func_get_args
    Liefert Funktionsargumente als Array
    http://de.php.net/vsprintf
    kanntest du ja bereits

    http://de.php.net/array_map
    Wendet eine Callback-Funktion auf die Elemente von Arrays an
    Einfach erklärt, wird als 1. Parameter ein Funktion erwartet:
    Entweder als String, dann wird dieser Name als Funktionsname verwendet, dessen erstes und einziges Argument jeweils der Reihe nach die Elemente des Arrays sind, der als 2. Argument an array_map übergeben wird.
    PHP-Code:
    <?php
    $cleaned 
    array_map('trim'$_POST); // wendet auf alle Elemente des $_POST Array die Funktion trim() an.
    ?>
    Zudem kannst du create_function() hier einsetzen, um eine temporäre Funktion zu erstellen. Das macht Sinn, wenn du die Funktion sonst nicht mehr brauchst und sie nicht allzu komplex ist.
    Mehr dazu unter
    http://de.php.net/create_function
    Weiter kannst du array_map auch als 1. Argument einen Array übergeben, dessen 1. Element ein Objekt (zB $this) oder ein String sein muss.
    Als 2. Element dieses Arrays muss ein String übergeben werden. Dieses Konstrukt wird so interpretiert: array($object, $method) bzw. array($class, $method).
    Ersteres ruft die Methode $method des Objekts $object auf, zweiteres ruft die statische Methode $method der Klasse $class auf.
    Somit wäre für mein oberes Beispiel also
    PHP-Code:
    <?php
    array_map
    (array($this'escapeVar'), $argv);
    ?>
    denkbar, sollte meine MyMySqlClass die Methode escapeVar implementiert haben.

    http://de.php.net/array_shift
    array_shift() liefert den ersten Wert von array, verschiebt die anderen Werte hinunter, und verkürzt array um ein Element.
    Deine escape_var() Funktion sollte übrigens über get_magic_quotes_gpc() den Status des Flags magic_quotes_gpc abfragen, der veranlaßt, ob User-Input Variablen automatisch mit addslashes() abgesichert werden.
    Liefert dir get_magic_quotes_gpc() also TRUE, solltest du auf den Value ein stripslashes() anwenden, um addslashes() wieder rückgängig zu machen. Es ist nämlich nicht ausreichend und deckt nicht alle Zeichen ab, die für MySQL escaped werden sollten.
    Nach bedingtem stripslashes() also dann mysql_real_escape_string($value, $this->connection) aufrufen!
    http://de.php.net/mysql_real_escape_string
    Maskiert spezielle Zeichen im unescaped_string unter Berücksichtigung des aktuellen Zeichensatzes der Verbindung, so dass das Ergebnis ohne Probleme in mysql_query() verwendet werden kann. Wenn Sie Binärdaten einfügen wollen, müssen Sie die Funktion auf jeden Fall verwenden.

    mysql_real_escape_string() ruft die Funktion mysql_real_escape_string der MySQL-Bibliothek auf, die folgende Zeichen mit einem Backslash ('\') versieht: \x00, \n, \r, \, ', " und \x1a.
    Hoffe geholfen zu haben.

    Kommentar


    • #3
      So fühlt es sich wohl an von Zergling mit einem Spontan Tutorial überrannt zu werden... :P
      [COLOR="#F5F5FF"]--[/COLOR]
      [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
      [COLOR="#F5F5FF"]
      --[/COLOR]

      Kommentar


      • #4
        Ah, vielen Dank Zergling!
        Das wäre auch eine Möglichkeit.

        Das ich aber nur
        Code:
        $sql = "SELECT
                    *
                 FROM
                    users
                 WHERE
                    Name = " . $_POST['name'];
        schreibe und die Klasse dann von alleine $_POST['name'] escaped funktioniert nicht?

        Kommentar


        • #5
          Zwergling?

          Lies dir mal mein Posting durch, speziell zu array_map. Empfehle dir aber wirklich vsprintf() und array_map() in genannter Kombination. Manchmal ist Sicherheit wichtiger als Schreibfaulheit.

          Und was ist an $db->execute("SELECT * FROM tabelle WHERE nickname = %s", $_POST['nickname']) schon zu lang, dass man es nicht eingeben könnte?

          Kommentar


          • #6
            Zitat von Zergling
            Zwergling?
            äh, sorry schon editiert^^

            Kommentar


            • #7
              laut suche bin ich aber nicht der erste der da ein "w" gelesen hat^^

              Kommentar


              • #8
                sieh zu dass du Land gewinnst

                Kommentar


                • #9
                  *Bookmarked*

                  Nein, nicht wegen Zw*, sondern wegen dieses tollen "Tutorials"!
                  Wirklich toll, sollte sich unser askah.. irgendwas noch bis diese Woche Samstag melden, könnte ich auch eins zu Formularen machen.
                  [FONT="Book Antiqua"][I]"Nobody is as smart as everybody" - Kevin Kelly[/I]
                  — The best things in life aren't things[/FONT]

                  Kommentar


                  • #10
                    evtl kannst du das ganze im Tutorials Forum noch posten. Fänd ich praktisch oder? die Tutorials von dir (anderen) sind eh ziemlich gut gemacht, muss man auch mal loben

                    PS: Zwergling is au nett
                    [I]"Weaseling out of things is important to learn. It's what separates us from the animals ... except the weasel." (Homer J. Simpson)[/I]

                    Kommentar


                    • #11
                      Danke, aber ich wüsste jetzt nicht unter welchem Titel dieses Posting ins Tutorial Forum kopiert werden sollte. Ist ja mehr eine lose Funktionserklärung. Steht alles eigentlich auch im Manual.

                      Kommentar

                      Lädt...
                      X