Fragensteller: Frage zu mysql_real_escape_string();

Hi,

ich trage in meine mysql-Tabelle Daten per Formular ein und behandel sie kontextgerecht mit mysql_real_escape_string($Variable).
Wenn ein User nun Zitat: "blabla" einträgt, steht in meiner Tabelle Zitat: "blabla". Heißt also, die Funktion escaped die ".

Ist das so gedacht? Ich hätte lieber den wirklichen reinen Text drin gehabt.

Grüße, Fragesteller

  1. Wenn ein User nun Zitat: "blabla" einträgt, steht in meiner Tabelle Zitat: "blabla". Heißt also, die Funktion escaped die ".

    mysql_real_escape_string() tut das nicht - es escaped zwar " aber die landen dann nicht so in der Datenbank. Du machst das ganze ggf. doppelt.

    Ist das so gedacht?

    Nein.

    Ich hätte lieber den wirklichen reinen Text drin gehabt.

    Denke ich mir.

    1. mysql_real_escape_string() tut das nicht - es escaped zwar " aber die landen dann nicht so in der Datenbank. Du machst das ganze ggf. doppelt.

      War auch meine erste Vermutung, aber ich wüßte nicht, wie und wo?

      Meine Query:

      $sql="insert into Tabelle (ID,Zitat) values (NULL,"".kontext($Zitat,string)."")";

      Und meine Funktion: (beides gekürzt)

      function kontext($Variable, $Type, $Min = 0, $Max = 100000000)
              {
                      switch($Type)
                      {

      case 'string':
                                      $Variable = mysql_real_escape_string($Variable);
                              break;
      }
      }

      Gruß.

      1. Lieber Fragensteller,

        $sql="insert into Tabelle (ID,Zitat) values (NULL,"".kontext($Zitat,string)."")";

        warum nicht so?

        $sql="insert into Tabelle (ID,Zitat) values (NULL,'".kontext($Zitat,'string')."')";

        In meinen Augen liest sich das wesentlich besser. Übrigens musst Du "string" als ebensolchen in Anführungszeichen schreiben, da PHP sonst von einer Konstanten ausgeht, die Du sicherlich nicht gemeint hast.

        Meines Wissens kannst Du den ersten Wert auch ganz in Deinem SQL-Statement weg lassen, da Du bei der ID offensichtlich auf "auto increment" setzt:

        $sql="insert into Tabelle (Zitat) values ('".kontext($Zitat,'string')."')";

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. warum nicht so?

          $sql="insert into Tabelle (ID,Zitat) values (NULL,'".kontext($Zitat,'string')."')";

          In meinen Augen liest sich das wesentlich besser.

          Gebe ich Dir Recht.

          Übrigens musst Du "string" als ebensolchen in Anführungszeichen schreiben, da PHP sonst von einer Konstanten ausgeht, die Du sicherlich nicht gemeint hast.

          Stimmt vollkommen. Steht auch auf meiner ToDo-List. Error reporting wirft nur einen Hoinweis aus, keinen Fehler, daher hab ichs noch nicht gemacht. Wird aber.

          Meines Wissens kannst Du den ersten Wert auch ganz in Deinem SQL-Statement weg lassen, da Du bei der ID offensichtlich auf "auto increment" setzt:

          Und auch das ist korrekt. Wie gesagt, das ist teilweise schon etwas älterer Code, den ich heute auch nicht mehr 1:1 so schreiben würde.

          Gruß.

  2. Hallo,

    ich trage in meine mysql-Tabelle Daten per Formular ein und behandel sie kontextgerecht mit mysql_real_escape_string($Variable).
    Wenn ein User nun Zitat: "blabla" einträgt, steht in meiner Tabelle Zitat: "blabla". Heißt also, die Funktion escaped die ".

    das tut mysql_real_escape_string() zwar tatsächlich; aber mySQL macht diese Maskierung intern wieder rückgängig, bevor die Daten eingetragen werden. In der Tabelle sollten also Rohdaten landen.

    Ist das so gedacht?

    Nein, klingt nach der PHP-Krankheit magic_quotes. Wenn das aktiviert ist, maskiert PHP selbständig alle Anführungszeichen, bevor das Script diese Daten bekommt - egal ob es sinnvoll ist oder nicht (meistens eher nicht).

    Ciao,
     Martin

    --
    Arzt:    Gegen Ihr Übergewicht hilft wohl nur noch Gymnastik.
    Patient: Sie meinen, Kniebeugen und so?
    Arzt:    Nein, Kopfschütteln. Immer dann, wenn Ihnen jemand was zu essen anbietet.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Nein, klingt nach der PHP-Krankheit magic_quotes. Wenn das aktiviert ist, maskiert PHP selbständig alle Anführungszeichen, bevor das Script diese Daten bekommt - egal ob es sinnvoll ist oder nicht (meistens eher nicht).

      Hi,

      magic_quotes_gpc Off Off
      magic_quotes_runtime Off Off
      magic_quotes_sybase Off Off

      Gruß

      1. Ist ggf. irgend eine DBAL im Weg?

        1. Ist ggf. irgend eine DBAL im Weg?

          Ich weiß nicht genau, was das ist, aber da ich sie vermutlich hätte installieren müssen: nein.

      2. Hi!

        Nein, klingt nach der PHP-Krankheit magic_quotes.
        magic_quotes_gpc Off Off

        Mach mal Kontrollausgaben der Daten,

        • so wie sie vom Nutzer kommen,
        • an der Stelle, bevor du sie ins INSERT schreibst
          -- vor der Behandlung
          -- nach der Behandlung

        var_dump() eignet sich dazu am besten.

        Lo!

        1. -- vor der Behandlung

          string(17) "Zitat: "blabla""

          -- nach der Behandlung

          string(21) "Zitat: \"blabla\""

          Oh!
          Wer escaped meine schönen Daten schon vorher?

          Mal im Ernst, so steht er im Formular (php-formatiert)

          <INPUT TYPE=TEXT NAME="Zitat">

          Ich kopiere ihn einmal nach dem Submit um (aus alten php4-Zeiten übernommen, daher der Kopiervorgang. Außerdem mag ich zu Scriptbeginn die Liste der vorhandenen POST und GET Daten als Übersicht):

          $Zitat= $_REQUEST['Zitat'];

          Und dann kommt schon meine Kontrollausgabe:

          var_dump($Zitat);
          echo("<br>");
          var_dump(kontext($Zitat,string));

          Nun bin ich etwas sprach- und ratlos :-(

          Gruß

          1. Lieber Fragensteller,

            -- vor der Behandlung

            string(17) "Zitat: "blabla""

            -- nach der Behandlung

            string(21) "Zitat: \"blabla\""

            Oh!
            Wer escaped meine schönen Daten schon vorher?

            soweit ich den Thread überblicke, hast Du noch immer nichts zu Deinen PHP-Einstellungen bezüglich magic quotes gesagt. Im Übrigen gibt es dafür eine Lösung mittels stripslashes.

            Liebe Grüße,

            Felix Riesterer.

            --
            ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
            1. Hello,

              soweit ich den Thread überblicke, hast Du noch immer nichts zu Deinen PHP-Einstellungen bezüglich magic quotes gesagt.

              Doch, hat er https://forum.selfhtml.org/?t=199923&m=1346361
              Fragt sich nur wie er diese Information beschafft hat. Hat er auch die richtigen Einstellungen (richtige php.ini) zur richtigen Zeit abgefragt?

              Im Übrigen gibt es dafür eine Lösung mittels stripslashes.

              ... die man erst anwenden sollte, wenn get_magic_quotes_gpc() abgefragt hat
              http://de2.php.net/manual/en/function.get-magic-quotes-gpc.php

              Liebe Grüße aus dem heute sehr feuchtwarmen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. Hi!

                Fragt sich nur wie er diese Information beschafft hat. Hat er auch die richtigen Einstellungen (richtige php.ini) zur richtigen Zeit abgefragt?

                phpinfo() befragen und zwar aus dem betreffenden Script heraus passt immer.

                Im Übrigen gibt es dafür eine Lösung mittels stripslashes.
                ... die man erst anwenden sollte, wenn get_magic_quotes_gpc() abgefragt hat
                http://de2.php.net/manual/en/function.get-magic-quotes-gpc.php

                Bei Disabling Magic Quotes steht eine Funktion, die ist umfassend für alle Fälle.

                Lo!

              2. Doch, hat er https://forum.selfhtml.org/?t=199923&m=1346361
                Fragt sich nur wie er diese Information beschafft hat. Hat er auch die richtigen Einstellungen (richtige php.ini) zur richtigen Zeit abgefragt?

                Fast :-|
                Ich hatte die richtigen Einstellungen der richtigen .ini, aber habe danach local weitergetestet und hier sind die magic_quotes auf "on". Sorry.

                Dennoch krieg ich es nicht ganz hin:

                Ich habe nun in meine Funktion folgendes gepackt und die " werden trotzdem geslashed :-(

                  
                function kontext($Variable, $Type, $Min = 0, $Max = 100000000)  
                {  
                switch($Type)  
                {  
                  
                case 'string':  
                	if (get_magic_quotes_gpc() === 1) {  
                $Variable = stripslashes(mysql_real_escape_string($Variable));  
                	} else {  
                $Variable = mysql_real_escape_string($Variable);  
                		}  
                break;  
                }  
                }  
                
                

                Gruß

                1. Hi!

                  Ich hatte die richtigen Einstellungen der richtigen .ini, aber habe danach local weitergetestet und hier sind die magic_quotes auf "on". Sorry.
                  Dennoch krieg ich es nicht ganz hin:

                  Nimm die Funktion von Disabling Magic Quotes und pack sie einmalig an den Scriptanfang, wenn du nicht die Magic-Quotes komplett wegkonfigurieren kannst.

                  $Variable = stripslashes(mysql_real_escape_string($Variable));

                  In welcher Reihenfolge werden geschachtelte Funktionen abgearbeitet?

                  Lo!

                  1. Nimm die Funktion von Disabling Magic Quotes und pack sie einmalig an den Scriptanfang, wenn du nicht die Magic-Quotes komplett wegkonfigurieren kannst.

                    Nein, auf meinen Produktivservern sind sie definitiv raus. Und in meinem XAMPP werd ich das schon schaffen.

                    $Variable = stripslashes(mysql_real_escape_string($Variable));

                    In welcher Reihenfolge werden geschachtelte Funktionen abgearbeitet?

                    Nicht von innen nach außen?

                    Achso, doch. Deshalb dann auch

                    $Variable = mysql_real_escape_string(stripslashes($Variable));

                    weil $Variable ja bereits geslashed des Weges daher kommt.

                    Dürfte aber das Ergebnis nicht identisch sein?

                    Gruß

                    1. Hallo,

                      $Variable = stripslashes(mysql_real_escape_string($Variable));
                      $Variable = mysql_real_escape_string(stripslashes($Variable));
                      Dürfte aber das Ergebnis nicht identisch sein?

                      nein, nur in ganz speziellen Ausnahmefällen - dann nämlich, wenn es in $Variable nichts zu escapen oder zu "strippen" gibt. Wenn du erst mysql_real_escape_string() anwendest, und dann stripslashes(), dann reißt stripslashes() die Maskierungszeichen wieder raus, die mysql_real_escape_string() eingefügt hat.

                      So long,
                       Martin

                      --
                      Lebensmotto der Egoisten:
                      Was ist so schlimm daran, dass jeder nur an sich selbst denkt? Dann ist doch an alle gedacht!
                      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    2. Hallo,

      wie sieht es denn aus, wenn magic_quotes aktiviert ist und daher stripslashes benutzt wird?
      Beeinflusst das nicht auch mysql_real_escape_string?

      1. Hi!

        wie sieht es denn aus, wenn magic_quotes aktiviert ist und daher stripslashes benutzt wird?
        Beeinflusst das nicht auch mysql_real_escape_string?

        Nein. Du meinst aber vermutlich, wie das Ergebnis aussieht, wenn M.Q.-ierte Daten an mysql_real_escape_string() übergeben werden. Das ist Mist, weil dann einmal zu viel maskiert wurde. Aus Sicht von MySQL hast du dann Nutzdaten mit ungewollten Zeichen drin. Da M.Q. sowieso ein Feature auf der Abschussliste ist, empfiehlt es sich, innerhalb der Scripte so zu arbeiten, als hätte es sie nie gegeben, sprich: immer von Rohdaten ausgehen und erst beim Kontextwechsel selbigen angemessen berücksichtigen. Hinzu kommt, falls man die M.Q nicht schon außerhalb des Scripts deaktivieren kann, sie zumindest innerhalb wieder davon zu befreien.

        Es ist nicht das DBMS, das die Maskierung benötigt, sondern allein das SQL-Statement. Da dieses Anweisungstexte und Nutzdatentexte miteinander mischt, muss man zwischen beidem eindeutig unterscheiden können. Nutzdaten dürfen kein Anweisungsbestandteil werden, weswegen im Wesentlichen die in den Nutzdaten enthaltenen Zeichen, die ebenfalls als Begrenzungszeichen verwendet werden, besonders zu kennzeichnen sind (zuzüglich des Maskierungzeichen selbst).

        Lo!