Ankündigung

Einklappen
Keine Ankündigung bisher.

Was bedeutet '".$Variable."' ?

Einklappen

Neue Werbung 2019

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

  • #16
    ok, hat sich erledigt Besten Dank nochmal

    Kommentar


    • #17
      auch htmlentities() und mysql_real_escape_string() sind unterschiedliche Funktionen mit unterschiedlichen Aufgabenbereichen.
      Die mysql-Datenbank stört sich nicht an html-Code. Den willst Du nur loswerden, weil er bei der Ausgabe per html Deine Seitenstruktur stören oder Schadcode enthalten kann.
      Aber das ist nur ein Problem der HTML-Ausgabe/Anzeige. Wenn Du es Dir mit einem Texteditor ansiehst oder als Postscript oder weiss der Geier was, ist es völlig egal, ob da nun html-Code in der Datenbank gespeichert wurde.

      Immer drüber nachdenken, warum etwas angewendet wird und aus welchem Grund in welchem Anwendungsbereich.

      Kommentar


      • #18
        ja das ist mir schon klar. Aber ich will eben beides verhindern. Code Injection und eben auch dass HTML Code ausgeführt wird.

        Wenn ich jetzt zuerst htmlentities($text, ENT_NOQUOTES) anwende und anschliessend mysql_real_escape_string($text), dann werden die " und ' leider nicht maskiert, obwohl ich sie bei htmlentities extra nicht konvertiere.

        Warum werden die " und ' dann nichtmehr erkannt?

        Ich will dann eigentlich dass letztendlich in meiner Datenbank die " und ' und \ maskiert vorliegen, und die HTML-Tags eben in ihren Entities.

        Kommentar


        • #19
          Code?

          Kommentar


          • #20
            PHP-Code:
            <?php
            function bearb($value)
                            {    
                                echo
            "ohne irgendwas: $value
            "
            ;
                                if (
            get_magic_quotes_gpc())
                                {
                                       
            $value stripslashes($value);
                                   }
                                   echo
            "nach stripsl: $value
            "
            ;
                                
            $value=htmlentities($valueENT_NOQUOTES);
                                echo
            "nach htmlent: $value
            "
            ;
                                
            $value "'" mysql_real_escape_string($value) . "'";
                                echo
            "nach stripsl, htmlent, escap: $value

            "
            ;
                                return 
            $value;
                            }
            ?>
            Die echos dienen nur dazu, um schrittweise zu überprüfen was mit meiner Eingabe passiert.
            dann wird der Wert an den Query übergeben:

            PHP-Code:
            <?php
            $query 
            sprintf("UPDATE xxx SET UserOrt=%s WHERE UserSession='".session_id()."' LIMIT 1"bearb($ort));
                             
            mysql_query($query) or die (mysql_error());
            ?>
            als Ausgabe krieg ich dann das:
            • ohne irgendwas: \"reutlingen\" \'teest\' ? \\</td> test

              nach stripsl: "reutlingen" 'teest' ? \</td> test

              nach htmlent: "reutlingen" 'teest' ? \&lt;/td&gt; &lt;b&gt;test&lt;/b&gt;

              nach stripsl, htmlent, escap: '\"reutlingen\" \'teest\' ? \\&lt;/td&gt; &lt;b&gt;test&lt;/b&gt;'



              Ort zurückgegeb Wert: '\"reutlingen\" \'teest\' ? \\&lt;/td&gt; &lt;b&gt;test&lt;/b&gt;'


            und in der Datenbank steht dann leider nur das:

            "reutlingen" 'teest' ? \&lt;/td&gt; &lt;b&gt;test&lt;/b&gt;

            also ohne Maskierung, und das führt dazu dass nichts ausgegeben wird.

            als Eingabe hab ich folgendes vorausgesetzt: (Wird vom Formular an $ort übergeben)

            "reutlingen" 'teest' ? \</td> test

            Der HTML-Code hat natürlich hier keinen Sinn..nur zum testen wie er behandelt wird.

            Kommentar


            • #21
              und in der Datenbank steht dann leider nur das:
              Mir scheint, Du programmierst keine Datenbankanwendung sondern eine elektronische Mülltonne. Wo kommt das HTML her und was hat das in einer Spalte namens Ort zu suchen?

              Kommentar


              • #22
                *löl* soso, elektronische Mülltonne. Besser als garnichts.
                Ich hätte vielleixht dazu sagen sollen, dass ich als Eingabe folgendes vorausgesetzt habe: (Wird vom Formular an $ort übergeben)

                "reutlingen" 'teest' ? \</td> test

                Die HTML-Fetzen kommen nur daher, weil ich ausprobieren wollte ob die HTML-Tags korrekt umgesetzt werden durch htmlentities.
                Ansonsten haben die keine Funktion und gehören auch nicht zum programm. Nur zu Testzwecken....

                Kommentar


                • #23
                  als Ausgabe krieg ich dann das:

                  ohne irgendwas: \"reutlingen\" \'teest\' ? \\</td> test

                  nach stripsl: "reutlingen" 'teest' ? \</td> test

                  nach htmlent: "reutlingen" 'teest' ? \&lt;/td&gt; &lt;b&gt;test&lt;/b&gt;

                  nach stripsl, htmlent, escap: '\"reutlingen\" \'teest\' ? \\&lt;/td&gt; &lt;b&gt;test&lt;/b&gt;'



                  Ort zurückgegeb Wert: '\"reutlingen\" \'teest\' ? \\&lt;/td&gt; &lt;b&gt;test&lt;/b&gt;'



                  und in der Datenbank steht dann leider nur das:

                  "reutlingen" 'teest' ? \&lt;/td&gt; &lt;b&gt;test&lt;/b&gt;


                  also ohne Maskierung, und das führt dazu dass nichts ausgegeben wird
                  Das ist doch richtig so.

                  Ok, anderes Beispiel:
                  Du willst in einem php-Skript ein Zeichenkettenliteral ausgeben, das sowohl ' als auch " enthält. Wie machst Du das (ohne heredoc)?
                  PHP-Code:
                  <?php echo 'lalala ' blub " tralala'; ?>
                  dafür bekommst Du von php eins auf die Mütze.
                  PHP-Code:
                  <?php echo 'lalala \' blub " tralala'?>
                  so geht das. Das störende Zeichen wird maskiert bzw. als zum Ihnalt gehörend markiert. Aber in der Ausgabe taucht das \ nicht auf; das ist auch nicht erwünscht.

                  Genauso ist das bei mysql auch
                  PHP-Code:
                  <?php
                  mysql_query
                  ("INSERT INTO a VALUES('lalala ' blub')"); ?>
                  'lalala ' blub' <- Ärger mit mysql
                  'lalala \' blub' <- so geht's, der \ wird aber nicht abgespeichert.

                  Kommentar


                  • #24
                    hmm ok, das ist auch wieder wahr.

                    Also, der User soll seine Daten selber ändern können. Dazu wird ein Formular angezeigt, das schon die bisherigen Daten enthält. Das sieht bei mir so aus:

                    PHP-Code:
                    <?php
                    $sql
                    ="SELECT UserOrt FROM xxx WHERE UserSession='".session_id()."' LIMIT 1";

                    $result1mysql_query($sql);
                    $row1 mysql_fetch_array($result1);
                            
                    echo
                    "
                        <tr>
                            <td>Wohnort:</td>
                            <td><input type=text name=ort value=
                    $row1[UserOrt]></td>
                        </tr>
                    "
                    ;
                    ?>
                    So, und da krieg ich eben jetzt nicht alles was in der Datenbank steht im Eingabefeld angezeigt, sondern nur das was in " " steht, also "reutlingen". Der Rest verschwindet.
                    Wie kann ich das umgehen?

                    Kommentar


                    • #25
                      lol
                      Du kannst wohl HTML, aber wenigstens die " setzen sollte man!!!
                      Ja dieser Beitrag war Notwendig!
                      :D :D :D :D :D :D :D :D :D :D :D :D :D

                      Kommentar


                      • #26
                        Zitat von saibot
                        Ich hätte vielleixht dazu sagen sollen, dass ich als Eingabe folgendes vorausgesetzt habe: (Wird vom Formular an $ort übergeben)

                        "reutlingen" 'teest' ? \</td> test
                        Huch? In was für einer Gegend wohnst Du denn?

                        Die HTML-Fetzen kommen nur daher, weil ich ausprobieren wollte ob die HTML-Tags korrekt umgesetzt werden durch htmlentities.
                        Obacht bei HTML! Laß Dir sowas nicht unterschieben. Und wenn, dann nur einfache Formatierungstags ala HTML 3.20. Ganz böse wären SCRIPT Tags, egal ob PHP oder JS, iframe, externe Bilder usw.

                        Verwende einfach htmlentities($string, ENT_QUOTES). Das entschärft alles.

                        Besser wäre allerdings, wenn Du strip_tags ($string) verwenden würdest. " und ' entschärfst Du dann mit mysql_escape_string. Dann hat die liebe Seele Ruh.[/img]

                        Kommentar


                        • #27
                          Zitat von meikel
                          Huch? In was für einer Gegend wohnst Du denn?
                          Hehe..Deutschland->Baden-Württemberg->Stuttgart->Reutlingen->geheimer Vorort


                          Laß Dir sowas nicht unterschieben. Und wenn, dann nur einfache Formatierungstags ala HTML 3.20. Ganz böse wären SCRIPT Tags, egal ob PHP oder JS, iframe
                          Ok, also für ein Eingabefeld hab ich hab NUR strip_tags verwendet, da man hier Ausnahmen festlegen kann, wie z.b. oder <a></a>. Hinterher dann noch mysql_real_escape_string.
                          Ich hätte lieber hier auch htmlentities verwendet, aber da kann man keine Ausnahmen festlegen. Du sagst dass SCRIPT Tags böse wären. Werden die von strip_tags() erkannt und rausgefiltert? Falls nicht, wie werd ich die denn dann los?


                          " und ' entschärfst Du dann mit mysql_escape_string. Dann hat die liebe Seele Ruh.
                          Ich hab erst ruh wenn das alles läuft Nerv ich schon?

                          Kommentar


                          • #28
                            Zitat von atom-dragon
                            lol
                            Du kannst wohl HTML, aber wenigstens die " setzen sollte man!!!

                            Jo schon, die hatte ich zuerst. Also so:

                            <input type=text name=email value=\"$row1[UserMail]\">

                            Aber damit gibts gar keine Ausgabe....

                            Kommentar


                            • #29
                              Und das $row1[UserMail] setz es in ".$row1[UserMail]." damit ist es schneller (Nur um Milli sekunden!)

                              mfg-AD
                              Ja dieser Beitrag war Notwendig!
                              :D :D :D :D :D :D :D :D :D :D :D :D :D

                              Kommentar


                              • #30
                                Nerv ich schon?
                                Etwas. Filtere die Eingangsdaten so, daß sie genau für das INSERT/UPDATE passen. Wenn true, dann rein, wenn false, dann User hauen.

                                Bei einem Ortsnamen haste doch keine Probleme:
                                alle Buchstaben, /, . und -

                                Geprüft wird mit preg_match() von Stringanfang bis Stringende. Eventuelle Leerzeichen killste vorher mit str_replace raus.

                                Hehe..Deutschland->Baden-Württemberg->Stuttgart->Reutlingen
                                Ach so. Ich dachte, Du wohnst in 'test'.
                                Ok, also für ein Eingabefeld hab ich hab NUR strip_tags verwendet, da man hier Ausnahmen festlegen kann, wie z.b. oder <a></a>.
                                Ich hätte lieber hier auch htmlentities verwendet, aber da kann man keine Ausnahmen festlegen.
                                Naja... Wenn Du HTML zuläßt, hast Du das Problem, daß Du kein htmlentities mehr einsetzen kannst, um zB. die Umlaute zu korrigieren. Es geht gerade noch dann, wenn Du nur solche Tags zuläßt, die keine Attribute haben. Dann mußt Du < und > vorher retten (mit str_replace so umwandeln, daß sie htmlentities in Ruhe läßt), htmlentities ausführen und < > wieder herstellen.

                                Kommentar

                                Lädt...
                                X