Escapen mit mysql_real_escape_string

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

  • Escapen mit mysql_real_escape_string

    Hallo Leute,

    ich bin grade etwas am Verzweifeln...verfluchtes Escaping!

    Ziel des Scriptes ist es, Strings UND Arrays sauber vor SQL-Injections zu schützen.
    Dann überprüf ich ob magic_quotes_gpc auf ON gestellt ist und mach es dann rückgängig.
    mysql_real_escape_string wird dann drüber gehauen und es sollte eigentlich alles funktionieren.
    Hier ist das Script:

    PHP-Code:
    <?php

    //Zur DB wurde bereits connectet

    function demaskieren($variable)         // entfernt bereits durch magic_quotes_gpc hinzugefügte Maskierungen wieder (auch bei Arrays!)
    {                        // Nutzung der Funktion nur in Verbindung mit clean_string()!
        
    if (is_string($variable))
            
    $variable stripslashes($variable);

        else
        {

            if (
    is_array($variable))
            {
                foreach(
    $variable AS $key => $value)
                
    demaskieren($variable[$key]);
            }
            
        }

    return 
    $variable;
        




    function 
    clean_string($string)            // Nutzung nur direkt vor dem Speichern in der DB! Maskiert alle Strings (auch Arrays!)
    {

    if (
    get_magic_quotes_gpc())
    {
        
    $string demaskieren($string);    
    }


    if (
    is_string($string))
        
    $string mysql_real_escape_string($string);

    else
    {

        if (
    is_array($string))
        {
            foreach(
    $string AS $key => $value)
            
    $string[$key] = mysql_real_escape_string($string[$key]);
        }
        
    }

    return 
    str_replace("\\n""\n"$string);    // lässt \n als einziges unmaskiertes Zeichen in der DB stehen

    }



    $wert[0] = 'xx \\n xx \\ xx \" xx \ xx 1';
    $wert[1] = 'xx \\n xx \\ xx \" xx \ xx 2';
    $wert[2] = 'xx \\n xx \\ xx \" xx \ xx 3';

    echo 
    $wert[0];
    echo 
    "<br />";
    echo 
    clean_string($wert[0])."<br />";
    $wert clean_string($wert);
    echo 
    $wert[0]."<br />";
    echo 
    $wert[1]."<br />";
    echo 
    $wert[2]."<br />";

    ?>
    Leider funzt das ganze nicht so wie ich mir das vorstell:

    1. Der String ist nicht richtig / nur teilweise escaped (s. an der Ausgabe des Strings)
    2. Wenn ich mit die FUnktion mit einem Array aufrufe, kommt am Ende (s. Ausgabe) etwas anderes heraus, als wenn ich ein String des Arrays alleine escape...

    Kennt sich jemand mit der Thematik aus? Ich hab echt keine Lust mehr und bin kurz davor mich nur auf magic_quotes_gpc zu verlassen.

    Liebe Grüße

    Alex

  • #2
    Deine demaskieren-Funktion macht mit Arrays überhaupt nicht das, was sie soll - das hättest du auch leicht selber herausfinden können, wen du mal elementares Debugging betrieben hättest!
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Hm, ich hab die Funktion von hier:
      SQL Injection

      Auf den ersten Blick erschien sie mir richtig...inwieweit ist sie denn fehlerhaft?

      Kommentar


      • #4
        Zitat von Alex87 Beitrag anzeigen
        Hm, ich hab die Funktion von hier:
        SQL Injection
        Fall von „zu !&%$ für Copy&Paste“, oder Fall von „was ich in fertigem Code nicht verstehe, schmeiße ich einfach mal raus, und hoffe dann, dass er trotzdem noch das gleiche tut“ - Klasse!

        Auf den ersten Blick erschien sie mir richtig...inwieweit ist sie denn fehlerhaft?
        Mache Testausgaben, vorher und nachher, dann siehst du es.
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          Hmmm, ich hab das[FONT=monospace] & vor dem Parameter ind er Hauptfunktion mal hinzugefügt, und siehe da, es funktioniert. Dachte das sein ein Schreibfehler im Script gewesen Dafür erstmal Danke!

          Was bewirkt & in diesem Fall?

          Jetzt zur generellen Frage zur Funktionalität:

          Wenn ich die Funktion [/FONT][COLOR=#000000][COLOR=#006600][/COLOR][COLOR=#0000CC]clean_string[/COLOR][COLOR=#006600]([/COLOR][COLOR=#0000CC]$string[/COLOR][COLOR=#006600]) [COLOR=Black]nun [/COLOR][/COLOR][/COLOR]mit folgendem String aufrufe:

          [COLOR=#000000][COLOR=#0000CC]echo clean_string[/COLOR][COLOR=#006600]([/COLOR][COLOR=#0000CC]'xx \\n xx \\ xx \" xx \ xx 2'[/COLOR][COLOR=#006600])[/COLOR][/COLOR];
          [COLOR=Black]
          Dann wird folgendes ausgegeben:
          [/COLOR]xx n xx xx \" xx xx 1


          Das ist aber doch nicht korrekt oder?!
          Bitte tu mir den Gefallen und versuch es mir zu erklären...bin nicht fit in der Thematik genug.

          Mein großes Problem ist einfach, dass ich kein Plan habe, WANN [COLOR=#000000][COLOR=#0000CC]magic_quotes_gpc[/COLOR][COLOR=#006600] [COLOR=Black]denn genau die Strings escaped. Nur bei [/COLOR][/COLOR][/COLOR]Get/Post/Cookie oder auch wenn ich selbst einer Variable einen Wert zuweise?
          [FONT=monospace]
          [/FONT][COLOR=#000000][COLOR=#007700][/COLOR][COLOR=#0000BB][/COLOR][/COLOR][COLOR=#000000][COLOR=#007700][/COLOR][COLOR=#0000BB]
          [/COLOR][/COLOR]

          Kommentar


          • #6
            & ist der Referenz-Operator und in magic_quotes_gpc steht GPC für Get, Post und Cookie. Die Details schlägst du jetzt bitte im Manual nach!

            Kommentar


            • #7
              Ok, Referenz-Operator ist nun klar, GPC auch.

              Nehmen wir nun an, ein User gibt in einem Formular folgenden String an (auch wenn er sinnlos ist):

              [COLOR=#000000][COLOR=#0000cc]xx \n xx \ xx " xx[/COLOR][/COLOR]

              [COLOR=black]Der String wird per Post a[/COLOR]n die nächste Seite weitergegeben. [COLOR=#000000][COLOR=#0000cc]magic_quotes_gpc[COLOR=black] macht daraus folgendes:

              [/COLOR][/COLOR][/COLOR][COLOR=#000000][COLOR=#0000cc]xx \\n xx \\ xx \" xx[/COLOR][/COLOR]

              [COLOR=black]mit meiner [/COLOR][COLOR=#000000][COLOR=#0000CC]demaskieren-[COLOR=black]Funktion mach ich dies wieder rückgänig.
              Nun kommt [/COLOR][/COLOR][/COLOR][COLOR=#000000][COLOR=#0000CC]mysql_real_escape_string[COLOR=black] und sollte wieder dies daraus machen:

              [/COLOR][/COLOR][/COLOR][COLOR=#000000][COLOR=#0000cc]xx \\n xx \\ xx \" xx[COLOR=black]

              So das Prinzip.

              Wenn ich versuche, dies damit nachzumachen (String entspricht dem Inhalt der Post-Variable):
              [/COLOR][/COLOR][/COLOR][COLOR=#000000][COLOR=#0000cc]echo clean_string[/COLOR][COLOR=#006600]([/COLOR][COLOR=#0000cc]'[/COLOR][/COLOR][COLOR=#000000][COLOR=#0000cc]xx \\n xx \\ xx \" xx[/COLOR][/COLOR][COLOR=#000000][COLOR=#0000cc]'[/COLOR][COLOR=#006600])[/COLOR][/COLOR];

              Dann gibt er mir jedoch das hier aus:
              [COLOR=Blue]xx n xx xx \" xx

              [COLOR=Black]Also stimmt doch noch etwas nicht, oder hab ich nun etwas nicht verstanden?[/COLOR]
              [/COLOR]

              Kommentar


              • #8
                Nutze bitte die php- bzw. code-Tags, statt den Text farbig zu formatieren.

                Zitat von Alex87 Beitrag anzeigen
                Wenn ich versuche, dies damit nachzumachen (String entspricht dem Inhalt der Post-Variable):
                PHP-Code:
                echo clean_string('xx \\n xx \\ xx \" xx'); 
                Dann gibt er mir jedoch das hier aus:
                Code:
                xx n xx  xx \" xx
                Ja, war doch zu erwarten.

                Deine Eingabe lautet
                Code:
                xx \n xx \ xx \" xx
                Deine demaskieren-Funktion macht daraus, wenn magic_quotes_gpc aktiv ist
                Code:
                xx n xx  xx " xx
                Bleibt als einzig potentiell gefährliches Zeichen das ", und um das kümmert sich anschließend mysql_real_escape_string ordnungsgemäß.
                I don't believe in rebirth. Actually, I never did in my whole lives.

                Kommentar


                • #9
                  Klasse wahsag, jetzt kann ichs nachvollziehen!

                  Nur ein Problem kommt für mich dadurch zustande:

                  Wenn ich Usereingaben von einem Textarea mit dieser Funktion bearbeite, macht sie aus einem durch den User eingefügten Zeilenumbruch "\n" ein "n".

                  Somit wird der Text ohne Zeilenumbrüche in der DB gespeichert und diese sind auch nicht mehr wiederherstellbar.

                  Als Lösung könnte man vor dem Aufruf von
                  PHP-Code:
                  stripslashes() 
                  alle "\n" in bspw "##Zeilenumbruch##" umwandeln und nach
                  PHP-Code:
                  stripslashes() 
                  wieder in ein "\n" verwandeln. Aber da gibt es doch sicherlich eine sauberere Methode, oder?

                  Kommentar


                  • #10
                    \\n ist kein Zeilenumbruch, sondern einfach nur ein Backslash gefolgt von einem n.

                    Kommentar


                    • #11
                      Zitat von Alex87 Beitrag anzeigen
                      Wenn ich Usereingaben von einem Textarea mit dieser Funktion bearbeite, macht sie aus einem durch den User eingefügten Zeilenumbruch "\n" ein "n".
                      Ein vom Nutzer in einer Textarea gemachter Zeilenumbruch ist überhaupt kein "\n" - das ist doch nur ein Behelfskonstrukt, um den Zeilenumbruch innerhalb von PHP-Quellcode darzustellen ...!

                      Deine Grundlagenkenntnisse scheinen irgendwo zwischen mangelhaft und miserabel angesiedelt zu sein.
                      Arbeite daran bitte erst mal, sonst bringt das hier nichts - weil wir dir jeden Kleinkram erklären müssen, der eigentlich selbstverständlich sein sollte.
                      I don't believe in rebirth. Actually, I never did in my whole lives.

                      Kommentar


                      • #12
                        Naja, nehmts mir ned übel, aber wofür ist das Forum denn da? Ich behaupte mal, dass ich zumindest ein Grundwissen an PHP habe. Und wenn hier nur Profis Fragen stellen dürfen, dann macht das Forum ja auch keinen Sinn mehr, oder?

                        Dass \n keinen Zeilenumbruch erzeugt ist mir schon klar.
                        Ich lese aber die Daten aus der DB aus und bevor ich diese dann auf der Webseite ausgebe, nutz ich PHP: nl2br - Manual , um die Zeilenumbrüche zu erzeugen.

                        Dadurch dass vom "\n" jedoch der Slash entfernt wird, ist die Umwandlung nicht mehr möglich...hoffe diese Frage geht in Ordnung

                        Kommentar


                        • #13
                          Zitat von Alex87 Beitrag anzeigen
                          Dass \n keinen Zeilenumbruch erzeugt ist mir schon klar.
                          Ich lese aber die Daten aus der DB aus und bevor ich diese dann auf der Webseite ausgebe, nutz ich PHP: nl2br - Manual , um die Zeilenumbrüche zu erzeugen.

                          Dadurch dass vom "\n" jedoch der Slash entfernt wird, ist die Umwandlung nicht mehr möglich...hoffe diese Frage geht in Ordnung
                          Warum sollte nl2br aus \n (Backslash + n) einen Zeilenumbruch erzeugen? Das macht doch keinen Sinn.

                          PHP-Code:
                          $text 'Hello \n World';

                          echo 
                          nl2br($text);
                          // Hello \n World 

                          Kommentar


                          • #14
                            Zitat von Alex87 Beitrag anzeigen
                            Dadurch dass vom "\n" jedoch der Slash entfernt wird, ist die Umwandlung nicht mehr möglich...
                            Nein, das ist immer noch falsch.

                            Der Zeilenumbruch, der dir vom Browser übermittelt wird, besteht nicht aus den Zeichen \ und n - also gibt es da auch kein \ zu entfernen.
                            I don't believe in rebirth. Actually, I never did in my whole lives.

                            Kommentar


                            • #15
                              Ich merks grad auch...

                              Das erste Beispiel im Manuel:

                              PHP: nl2br - Manual

                              Ist aber eigentlich das, was ich meine... Das gibts doch nicht.

                              PHP-Code:
                              <?php
                              echo nl2br("foo ist nicht\n bar");
                              ?>
                              Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

                              HTML-Code:
                              foo ist nicht<br />
                               bar
                              Ich weiß, es ist spät, aber da stehts doch?^^ Wieso geht das jetzt nicht in meinem Test-Script.
                              Ich hasse PHP

                              Kommentar

                              Lädt...
                              X