Ankündigung

Einklappen
Keine Ankündigung bisher.

mysql_real_escape_string vs. htmlspecialchars

Einklappen

Neue Werbung 2019

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • mysql_real_escape_string vs. htmlspecialchars

    Hallo!

    Ich habe hier ein Eingabefeld, das mal text und mal textarea ist. Wenn es eine Textarea ist, werden die Daten von tinyMCE vorformatiert.

    Das Problem ist, nehme ich htmlspecialchars, werden alle eckigen Klammern umgewandelt. Anführungszeichen jedoch gehen durch und könnten dementsprechend für einen Angriff missbraucht werden.

    Nehme ich mysql_real_escape_string bleiben die HTML-Tags, aber die Anfürhungszeichen werden escaped, was wiederum später im Editor entsprechend aussieht.

    Was also tun, wenn man Sicherheit und HTML will

    Danke.


  • #2
    Hat dieses Thema überhaupt etwas mit Datenbanken zu tun? Wenn ja, dann klär mich mal bitte auf, inwiefern. mysql_real_escape_string() allein kann ja wohl nicht der Grund sein, oder?

    Dies hier kannst du dir schon mal durchlesen: http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel

    Was mit Anführungszeichen beim Einsatz von htmlspecialchars geschieht, kannst du über den zweiten Parameter beeinflussen.
    http://hallophp.de

    Kommentar


    • #3
      wie wärs mit htmlspecialchars() und addslashes() ? du musst dann nur die Ausgabe im RTE mittels htmlspecialchars_decode() & stripslashes() zurück übersetzen.

      Sollte tun oder irre ich mich?

      Kommentar


      • #4
        Beim Einfügen von Daten in einen SQL-String: mysql_real_escape_string

        Beim Ausgeben von Daten auf einer HTML-Seite: htmlspecialchars

        So und nicht anders.

        Kommentar


        • #5
          Jop, ich verschiebe es mal nach PHP-Einsteiger.

          [MOD: Thread verschoben]
          http://hallophp.de

          Kommentar


          • #6
            Ich komme hier nicht weiter. Ich verwende nun ausschließlich mysql_real_escape_string, wenn die Daten in die Datenbanken kommen.

            Das mit addslashes() funktioniert leider nicht. Wenn die Daten ausgegeben werden, können sie auch in einem input-textfeld als value stehen. Jedes " unterbricht dann ja das Value

            Also habe ich mir jetzt eine funktion geschrieben:

            PHP-Code:
            function no_escape($f_string) {
                
            $f_return str_replace('"'"""$f_string);
                
            $f_return str_replace("'""„"$f_string);
                return 
            $f_return;

            Leider will er " und ' nicht erkennen, unabhängig ob ich es wie oben gezeigt angebe, oder diese noch escape, damit str_replace nicht durcheinander kommt.

            Weitere Ideen?

            Kommentar


            • #7
              Fürs ausgeben reicht html_entities().

              Kommentar


              • #8
                mysql_real_escape_string() !== addslashes(). Die beiden Funktionen sind unter keinen Umständen gegeneinander auszutauschen. Und hmtlspecialchars()/htmlentities() ist sowieso was ganz anderes.
                Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

                Kommentar


                • #9
                  Mach doch mal bitte ein Beispiel, wie eine Eingabe vorformatiert von tinyMCE bzw. einem normalen Eingabefeld aussieht und wie du es eigentlich haben möchtest. Hat tinyMCE denn keinen BBCode-Interpreter? Denn dann müsstest du ja eigentlich nichts tun, außer diese Eingabe eben an den "Interpreter" (der die Umwandlung von BBCode in HTML-Code erledigt) zu übergeben und bei der normalen Texteingabe htmlentities() zu verwenden. Bevor du etwas in die DB schreibst, musst du *immer* mysql_real_escape_string() anwenden (oder bei Zahlen ein INT-Cast durchführen).
                  "Mein Name ist Lohse, ich kaufe hier ein."

                  Kommentar


                  • #10
                    Das komplette einfache, tinyMCE-lose Beispiel mal:

                    Eingabefeld:

                    PHP-Code:
                    <input type="text" name="test" value="<?=arr[daten];?>">
                    Das ganze wird mit folgendem PHP-Code verarbeitet

                    PHP-Code:
                    mysql_query(INSERT INTO table SET test '".mysql_real_escape_string($_POST['test'])."'") 
                    Entsprechend mit einem UPDATE.

                    Nehmen wir als Text "Gestern war ein "schöner" Tag", wird nun in die DB Geschrieben "Gestern war ein \"schöner\" Tag". Rufe ich das ins Formular, landet da ein

                    PHP-Code:
                    <input type="text" name="test" value="Gestern war ein \"schöner\" Tag"
                    Die Browser werden das " nach dem \ als ende des value. Nehmen wir ein textarea an, ist das kein Problem. Dafür wird aber bei jedem weiteren Speichern ein weiterer \ hinzugefügt.

                    Problematisch ist auch die Ausgabe in HTML. Dort werden die \ entsprechend auch angezeigt.


                    NACHTRAG:
                    Die Daten aus TinyMCE sind im Prinzip die selben. Nur das eben noch HMTL-Tags drumherum sind.

                    Kommentar


                    • #11
                      ja eben - und deshalb kommt das zeuch nicht nackt ins EIngabefeld, sondern mit htmlspecialchars($string,ENT_QUOTES);

                      dann entfernt er die \" und ersetzt sie durch &quot; - was dann durch html im Browser automatisch zu " wird - ABER eben nur im Browser .. dein Value sieht dann so aus value="horst schmidt &quot;Falken-AG&quot; Burscheidt" (oder was bei dir so auftreten kann)
                      "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

                      Kommentar


                      • #12
                        Wenn ich mich nicht vertue, sieht das nach Magic Quotes aus.

                        - http://php.net/manual/en/security.magicquotes.php
                        - http://www.phpforum.de/forum/showthread.php?t=217421

                        Kommentar


                        • #13
                          So isses. Die mit mysql_real_escape_string bearbeiteten Daten werden von PMA ohne den Backslash dargestellt.
                          da fehlt:
                          PHP-Code:
                              foreach ( $_POST AS $key => $value ) {
                                  if ( 
                          get_magic_quotes_gpc() ) {
                                      
                          $value stripslashes($value);
                                      
                          $_POST[$key] = $value;
                                  }
                                  
                              } 
                          wobei man in die Schleife auch praktischerweise ein trim() mit einbauen kann.

                          Siehe auch Hinweis von Nikosch in #14
                          PHP-Code:
                          if ($var != 0) {
                            
                          $var 0;

                          Kommentar


                          • #14
                            PHP-Code:
                                foreach ( $_POST AS $key => $value ) {
                                    if ( 
                            get_magic_quotes_gpc() ) {
                                        
                            $value stripslashes($value);
                                    }
                                    
                            $_POST['key'] = $value;
                                } 
                            Hinweis wie immer: $_POST Kann auch mehrdimensional sein. Hier ist also eine rekursive Funktion gefragt. Zum zweiten ist die ständige Abfrage von get_magic_quotes_gpc() unnötig inperformant. Zudem heißt es $_POST[$key].. Und eine Zuweisung ohne Änderung ist eigentlich auch sinnfrei. Fazit: BadFunction().
                            --

                            „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


                            • #15
                              Schdümmt, war schnell hingeschludert ohne zu testen. Ich ändere die Zeile ( ['key'] oben. Wer daraus eine Funktion machen möchte, der kann die Rekursion ja noch einbauen.
                              PHP-Code:
                              if ($var != 0) {
                                
                              $var 0;

                              Kommentar

                              Lädt...
                              X