Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Magic quotes gpc Auswirkungen zuruecksetzen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Magic quotes gpc Auswirkungen zuruecksetzen

    Hallo beisammen,

    auf meinem Server ist magic_quotes_gpc on.. Nun habe ich mich daran gemacht, den Text dahingehend noch zusaetzlich vor dem INSERT zu filtern.
    Also habe ich eine Funktion in meiner functions.php dafür angelegt:

    PHP-Code:
    function clean_it($dirty){ 
        if (
    get_magic_quotes_gpc()) {
            
    $clean mysql_real_escape_string(stripslashes(htmlspecialchars($dirty)));
        }else{
            
    $clean mysql_real_escape_string(htmlspecialchars($dirty));
        }
        return 
    $clean;


    Ich habe ein kleineres Messagesystem geschrieben, welches (zu meiner Verwunderung) sogar funktioniert hat.. Jedoch gibt es dieses Problem:
    Ich sende Text an User X:
    Zeilenumbruch folgt

    "Anfuehrugszeichen"

    'usw'

    Dieser erhaelt:
    Zeilenumbruch folgt\r\n\r\n\\\"Anfuehrugszeichen\\\" \r\n\r\n\\\'usw\\\'
    Waere alss meine Frage, warum ist das so? Ich versteh's nicht..
    Ich habe auch wirklich keine Ahnung, an welcher Stelle im Code DAS liegen mag..

    Ich poste mal alles, was zum INSERT gehoert:
    PHP-Code:
        if($_GET['open'] == "senden") {
            
    $empfaenger_gueltig false;
            
    $an $_POST['an'];
            
    $betreff $_POST['betreff'];
            
    $text clean_it($_POST['text']);
            
    $_SESSION['mail_text'] = $text;
            
    $_SESSION['mail_an'] = $an;
            
    $_SESSION['mail_betreff'] = $betreff;
            if(
    $an != "")
                if(
    $betreff != "")
                    if(
    $text != "") {
                        
                        
    // Frage ab
                        
    $sql "SELECT id,username,email FROM user";
                        
    $result mysql_query($sql);
                        while(
    $row mysql_fetch_object($result))
                            if(
    $row->id == $an || $row->username == $an) {
                                
    // dann empfaenger ok
                                
    $empfaenger_gueltig true;
                                
    $empfaenger_id $row->id;
                                
    $mail $row->email;
                            }
                        if(
    $empfaenger_gueltig) {
                            if(
    $empfaenger_id != $user_id){
                                
                                
    $sql "INSERT INTO messages (von, an, betreff, text, gelesen, loeschsender, loeschempfaenger) VALUES 
                                                ('"
    .clean_it($user_id)."','".clean_it($empfaenger_id)."','".clean_it($betreff)."','".clean_it($text)."',0,0,0)";
                                
    // Wenn Insert erfolgreich
                                
    if(mysql_query($sql)) {
                                echo 
    "Nachricht verschickt";
                                
    // Destroy all Sessions
                                
    unset($_SESSION['mail_text']);
                                unset(
    $_SESSION['mail_an']);
                                unset(
    $_SESSION['mail_betreff']);
                                }    
    //andernfalls Fehlermeldungen
                                
    else echo "..";    
                            }
                            else echo 
    "..";
                        }
                        else echo 
    "..";
                    }
                    else echo 
    "..";
            else echo 
    "..";
        } 
    Normalerweise muesste der Text sauber gefiltert eingetragen werden, so wie es z.B. mit einem aehnlichen Code beim "Newsbeitraege verfassen" oder "Kommentare verfassen" auch funktioniert?! (Newsscript)

    Ich korrigiere mich: Ich habe gerade bemerkt, dass es dort ebenfalls nicht funktioniert!

    Wenn ich das richtig verstanden habe, reicht es doch, die Variablen vor dem INSERT dadurch zu filtern, und dann kann ich sie ganz normal mit $row->text ausgeben, oder?

    Desweiteren frage ich mich, ob clean_it UEBERHAUPT irgendetwas macht?! Sonst waeren die sql Injections ein wenig gefaehrlich :O

    Gueße
    disturbedchick

    P.S. Ich bin noch am lernen, wie man sieht.. Seid also nachsichtig mit mir, falls ich hier den totalen Mist gemacht habe


  • #2
    Solche all-in-one-Funktionen wurden hier schon öfter vorgestellt und als unsinnig kritisiert. Das trifft auch auf Deine Lösung zu. Benutz mal die Forensuche und mach Dich schlau.
    --

    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


    --

    Kommentar


    • #3
      Achso.. Aber ich brauche sie ja allesamt!

      Wie soll ich das denn sonst anstellen? Ich kenne gar keine andere Moeglichkeit.. und verzichten kann ich ja leider auf keine von den 3 Funktionen!

      Waere es denn sinnvoll, wenn ich den Text beim INSERT nur durch mysql_real_escape_string filtere und dann bei der jeder Ausgabe einzeln durch htmlspecialchars und stripslashes ? Das hoert sich ziemlich umstaendlich an
      Wuerde das Auswirkungen darauf haben, wenn ich zb auf einen Server umziehe, bei dem magic quotes gpc off ist?

      Bedeutet das nun, dass dadurch die SQL Injections Gefahr nicht beseitigt ist?

      Ich finde leider nichts bei der Forensuche

      Kommentar


      • #4
        Teste doch mal separat, was die einzelnen Funktionen nacheinander bewirken. Bei mysq_real_escape_string dann aber nicht die nötige Connection vergessen. Parallel liest Du noch die Doku und schon hast Du es.
        und verzichten kann ich ja leider auf keine von den 3 Funktionen!
        Ich denke, auf htmlspecialchars kannst Du hier sicher verzichten. Die Funktion setzt Du besser beim Output, also nach dem auslesen aus der Datenbank ein.
        Es ist schon alles gesagt. Nur noch nicht von allen.

        Kommentar


        • #5
          Zitat von drsoong Beitrag anzeigen
          Bei mysq_real_escape_string dann aber nicht die nötige Connection vergessen. Parallel liest Du noch die Doku und schon hast Du es.
          Was meinst du genau mit der Connection? Da komm ich nicht ganz mit..

          Kommentar


          • #6
            Hier ein Auszug aus: PHP: mysql_real_escape_string - Manual
            The MySQL connection. If the link identifier is not specified, the last link opened by mysql_connect() is assumed. If no such link is found, it will try to create one as if mysql_connect() was called with no arguments. If no connection is found or established, an E_WARNING level error is generated.
            Es ist schon alles gesagt. Nur noch nicht von allen.

            Kommentar


            • #7
              http://www.php.de/php-einsteiger/516...injection.html
              --

              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


              --

              Kommentar


              • #8
                Achsoo.. die mysql connection.. Das ist logisch. Ich dachte jetzt kommt noch etwas Anderes..

                - Ich bin nun vollkommen durcheinander! Ich weiß gar nicht, wie ich das angehen soll.. Zumal ich zu "All in one Funktionen" nichts gefunden habe..

                Was macht es denn für einen Unterschied, ob ich sie zusammen als eine große Funktion definiere, oder jede einzeln als Funktion und sie dann nacheinander abrufe?!


                Ich habe mir da was ueberlegt, habe aber keine Ahnung, ob das wirklich sinnig ist! Zumal ich vor jeder nochso kleinen Ausgabe den Text in eine Variable uebernehmen muesste..
                PHP-Code:
                function save_it($unsave){ 
                        
                $save mysql_real_escape_string($unsave);
                 return 
                $save;

                PHP-Code:
                function clean_it($dirty){ 
                    if (
                get_magic_quotes_gpc()) {
                        
                $clean htmlspecialchars($dirty);
                    }else{
                        
                $clean $dirty;
                    }
                    return 
                $clean;

                INSERT
                PHP-Code:
                $sql "INSERT INTO Tabelle (spalte1, spalte2) VALUES 
                        ('"
                .clean_it(save($variable1))."','".clean_it(save($variable2))."')"
                ABRUFEN
                PHP-Code:
                $sql "SELECT spalte1 FROM Tabelle WHERE id='3' LIMIT 1";
                $row mysql_fetch_object(mysql_query($sql)); 
                .. und ausgeben
                PHP-Code:
                    $text1 $row->spalte1;
                    
                $text1 stripcslashes($row->spalte1);
                    echo 
                bbcode($text1); 

                Kommentar


                • #9
                  Siehe Link. htmlspecialchars hat jedenfalls nicht die Bohne was mit Datenbanken zu tun.
                  --

                  „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                  Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                  --

                  Kommentar


                  • #10
                    Gut.. ich mache es jetzt Folgendermaßen:
                    functions.php:
                    PHP-Code:
                    function clean_it($dirty){
                        
                    $clean mysql_real_escape_string($dirty);
                        return 
                    $clean;
                    }


                    function 
                    no_slashes($slash){ 
                        if (
                    get_magic_quotes_gpc()) {
                            
                    $noslash stripslashes($slash);
                        }else{
                            
                    $noslash $slash;
                        }
                        return 
                    $noslash;

                    clean_it benutze ich nach wie vor beim INSERT..
                    no_slashes benutze ich beim Ausgeben
                    PHP-Code:
                    $text no_slashes($row->text);
                    echo 
                    bbcode($text); 
                    Das ist jetzt das Ergebnis, das ich haben wollte. HTML Code " < " usw wird angezeigt, aber nicht ausgefuehrt..

                    ABER immer noch nicht in der Datei messages.php.. Die scheint sich zu sträuben! Zb auf der Seite index.php (wo ich news ausgebe), funktioniert alles wunderbar!
                    Ich bin mir gar nicht sicher, ob messages.php überhaupt clean_it geschweigedenn no_slashes ausführt!
                    Also habe ich bei der Ausgabe des Textes DIREKT so gearbeitet:
                    PHP-Code:
                    $text stripslashes($row->text);
                    echo 
                    $text
                    Und was kommt raus? Das:
                    /" test /"
                    ABER der Zeilenumbruch wird noch immer als
                    rn rn
                    angezeigt.. Alles Anderes so wie es sein sollte.

                    Weiß Jemand, woran das noch liegen könnte?

                    Kommentar


                    • #11
                      Lustig, wie nachhaltig die Threads hier im Forum sind. Hier das Thema von gestern. Ersetze safe() einfach durch clean_it():

                      http://www.php.de/php-einsteiger/693...pe_string.html
                      --

                      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                      --

                      Kommentar


                      • #12
                        nikosch:
                        Ersetze safe() einfach durch clean_it():
                        Ist mir auch schon aufgefallen.

                        disturbedchick: Zeilenumbrüche werden durch Backslashes escaped. Also
                        Code:
                        \r\n
                        Wenn Du stripslashes darauf anwendest, bleibt
                        Code:
                        rn
                        übrig.
                        Es ist schon alles gesagt. Nur noch nicht von allen.

                        Kommentar


                        • #13
                          Zitat von nikosch Beitrag anzeigen
                          Lustig, wie nachhaltig die Threads hier im Forum sind. Hier das Thema von gestern. Ersetze safe() einfach durch clean_it():

                          http://www.php.de/php-einsteiger/693...pe_string.html
                          Ja.. die Funktion mit einer Funktion aufrufen, ist Unsinn etc, ist EINE Meinung... gut.
                          Aber der Sachverhalt ist nicht der Gleiche.. Zumal ich auch keine Fehlermeldungen rausholen kann.

                          Aber leider ist das immer noch nicht die Ursache dafür, warum es nicht funktioniert, wenn ich die Funktion aufrufe...
                          Bei diesem Thread hatte sie vermutlich irgendwo anders einen Fehler.. Ich sehe dort zumindest keine Lösung..

                          - Und was möchtest du bitte mit nachhaltig sagen?
                          Ich habe eben ein Problem, bei dem ich die Ursache nicht finde und wende mich damit an eine Forum. Mache, was mir die erfahrenen Nutzer sagen und es funktioniert dennoch nicht. Dann bekomme ich gesagt
                          "Witzig wie nachhaltig diese Threads sind"
                          - Wenn es noch nicht läuft ?!


                          disturbedchick: Zeilenumbrüche werden durch Backslashes escaped. Also
                          Code:

                          \r\n

                          Wenn Du stripslashes darauf anwendest, bleibt
                          Code:

                          rn

                          übrig.
                          Aber, wenn ich stripslashes nicht anwende kommt auch bei jedem Anführungszeichen ein Backslash... Und dann wird mir doch anstatt
                          Code:
                          rn
                          Auch einfach nur
                          Code:
                          /r/n
                          angezeigt..

                          Ich verstehe einfach nicht, warum es nicht funktioniert... Und in messages.php funktioniert noch es noch nicht einmal, wenn ich DIREKT bei der AUSGABE stripslashes anwende.. Funktion wird einfach missachtet..Und ob clean_it ausgeführt wird, kann ich gar nicht beurteilen.. Diese Datei will es anscheinend einfach nicht! Wie geht das denn? Ich heule bald ey

                          Kommentar


                          • #14
                            Ihm geht es darum, dass die selbe Frage schon öfters gestellt wurde und anscheinend die schon beantworteten Fragen wertlos sind weil sie ja eh keiner sucht und wir somit die Antwort zig mal erneut schreiben müssten.

                            Kommentar


                            • #15
                              O.K. sieht so aus, als wenn das hier mal wieder kurz vorm eskalieren ist.

                              Also, keine Ahnung, wann und in welcher Reihenfolge Du was in Deiner aktuellen Codefassung anwendest. Deshalb mal so:

                              1. Elimieniere die Wirkung von Magic Quotes
                              D. h. nehme die per Magic Quotes dem Userinput hinzugefügten Slashes per stripslashes wieder raus.

                              2. Dann füge Deinen Input unter Anwendung von mysql_real_escape_string in die Datenbank ein

                              3. Liest Du die in der Datenbank gespeicherten Werte später wieder aus und gibst sie aus, dann mach das mit
                              htmlspecialchars bzw. htmlentities also htmlspecialchars($row->irgendwas)
                              Es ist schon alles gesagt. Nur noch nicht von allen.

                              Kommentar

                              Lädt...
                              X