Ankündigung

Einklappen
Keine Ankündigung bisher.

Richtig filtern + Ausgabe

Einklappen

Neue Werbung 2019

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

  • Richtig filtern + Ausgabe

    Hallo zusammen,

    ich beschäftige mich seit ca. einem halben Jahr in meiner Freizeit mit PHP. Ich kann zurzeit in einer Textarea einen Text eingeben (inkl. WYSIWYG) Editor. Dieser Text wird in einer DB gespeichert und soll dann wieder ausgegeben werden. Dies funktioniert auch sehr gut, jedoch habe ich Probleme mit bestimmten Zeichen... und es sollte natürlich auch sicher sein. Ich übergebe den Text über Post und Frage ihn folgendermaßen ab:
    PHP-Code:
          $faq_errordescription filter_input(INPUT_POST"faq_errordescription",FILTER_UNSAFE_RAW);

        if (
    $insert_stmt $mysqli->prepare("INSERT INTO faq (faq_errordescription)VALUES (?)"))
        {

            
    $insert_stmt->bind_param('s'$faq_errordescription);
            
    $insert_stmt->execute();
        } 
    Ich behandle meine String nicht mit mysqli_real_escape_string oder ähnlichem da dies ja bei prepared statements nicht nötig ist... wie ich gelesen habe.

    Mein Text den ich Speichere ink. SQL injection Test:
    Test Fett und unterstrichen Test kursiv Farbig SQL in. Test: <script type="text/javascript">alert("XSS");</script> TEST ENDE
    in der Datenbank steht nun folgendes:
    Test <b>Fett </b>und <u>unterstrichen </u>Test kursiv <font color="#cc3300">Farbig SQL in. Test:</font>&nbsp;&lt;script type="text/javascript"&gt;alert("XSS");&lt;/script&gt; TEST ENDE
    Jetzt kommen wir zur Ausgabe, ich habe in meinen Unterlagen, Büchern immer wieder gelesen das Texte die dem User angezeigt werden immer mit htmlspecialchars() behandelt werden müssen. (Egal woher zum Beispiel über post oder aus einer DB) Dies habe ich auch gemacht jedoch bekomme ich dann:
    Test <b>Fett </b>und <u>unterstrichen </u>Test kursiv <font color="#cc3300">Farbig SQL in. Test:</font>&nbsp;&lt;script type="text/javascript"&gt;alert("XSS");&lt;/script&gt; TEST ENDE
    wenn ich htmlspecialchars() ignoriere und es einfach mit echo ausgebe ist mein Text wie gewünscht und der SQL injection Test wird auch nicht ausgeführt... also eigentlich richtig... Bin nur verunsichert das ich überall lese das ausgaben mit htmlspecialchars behandelt werden sollen.

    Ich habe auch schon gedacht dass ich eventuell die Zeichen bevor ich Sie in in die Datenbank gebe mit FILTER_SANITIZE_SPECIAL_CHARS
    PHP-Code:
    filter_input(INPUT_POST"faq_reason"FILTER_SANITIZE_SPECIAL_CHARS); 
    bearbeite aber dann bekomme ich in der Datebank diesen Text
    Test &#60;b&#62;Fett &#60;/b&#62;und &#60;u&#62;unterstrichen &#60;/u&#62;Test kursiv &#60;font color=&#34;#cc3300&#34;&#62;Farbig SQL in. Test:&#60;/font&#62;&#38;nbsp;&#38;lt;script type=&#34;text/javascript&#34;&#38;gt;alert(&#34;XSS&#34;&#38;lt;/script&#38;gt; TEST ENDE
    bei der Ausgabe von diesem Eintrag aus meiner Datenbank bekomme ich weder mit htmlspecialchars noch ohne ein richtiges Ergebnis.


    Ich hoffe ich konnte mich deutlich ausdrücken und bedanke mich schon mal in voraus für die Mühe.

  • #2
    htmlspecialchars() dient für den Kontextwechsel von Text nach HTML. Wenn du nicht Text sondern HTML-Code ausgeben möchtest, musst du htmlspecialchars() natürlich weg lassen.

    Wenn du HTML-Code vom User entgegen nimmst, musst du ihn validieren und filtern. Hierfür gibts zum Beispiel HTML Purifier.

    Kommentar


    • #3
      Man kann auch statt HTML, dem Benutzer BBCode oder Varianten davon anbieten um den Code zu strukturieren. Das vereinfacht dann die Sache mit der Trennung von HTML Code und reinem Text erheblich. ein Beispiel dazu findest direkt hier im Forunseditor, wo das so gehandhabt wird.

      Kommentar


      • #4
        Es gibt auch WYSWYG-Editoren, die direkt statt HTML bereits BBCode erstellen: https://www.google.com/search?q=wyswyg+bbcode

        Kommentar


        • #5
          Zitat von protestix Beitrag anzeigen
          Man kann auch statt HTML, dem Benutzer BBCode oder Varianten davon anbieten um den Code zu strukturieren. Das vereinfacht dann die Sache mit der Trennung von HTML Code und reinem Text erheblich. ein Beispiel dazu findest direkt hier im Forunseditor, wo das so gehandhabt wird.
          Oder Markdown was mittlerweile die BBCodes wohl abgelöst hat.

          Kommentar


          • #6
            Zitat von Zeichen32 Beitrag anzeigen
            Oder Markdown was mittlerweile die BBCodes wohl abgelöst hat.
            Ist Markdown generell mittlerweile "einheitlicher"?

            Das letzte mal was ich damit was zu tun hatte war, als wir die PHP.de-Wissenssammlung gemacht hatten. Da gab es damals das Problem mit Markdown, Kramdown und GithubFlavoured Markdown.. Waren alles etwas abweichende Dialekte wenn man es so nenen will und zu Beginn etwas ärgerlich. Schlussendlich sind wir dann von Github Flavoured Markdown bei Kramdown gelandet.

            Kommentar


            • #7
              Ich sag mal so, die Standard Syntax ist ja über all gleich, wie auch bei BBCode.
              Erweiterte Syntaxen wie z.B. Code Blöcke ua. können sich aber unterscheiden. Das kommt dann auf den Programmierer an, für welchen "Dialekt" er sich entscheidet.
              Wobei sich größtenteils aber GithubFlavored Markdown durchgesetzt hat. (GitHub, GitLab, Bitbucket etc)

              Kommentar


              • #8
                Zeichen32 ok, danke dir für die Info!

                Kommentar


                • #9
                  Ich bin auf markdown nicht eingegangen, da ich nicht weiss inwieweit es von den üblichen Standard-Wysiwyg-Editoren unterstützt wird.
                  Er gab ja an einen zu verwenden.
                  Für FCK und Tniymce gibt es ein Plugin, das es sehr einfach macht BBCODE anzuwenden und PHP bietet da auch unterstützende Funktionen an.

                  Kommentar


                  • #10
                    Ist markdown und wysiwyg nicht etwas widersprüchlich? Wenn man bspw. mit typora arbeitet erkennt man dass das irgendwie den Schreibfluss stört. Besser sind die 2-geteilten Markdown Editoren.

                    PHP-seitig benutze ich parsedown..

                    Kommentar

                    Lädt...
                    X