Sascha: [Frage - Textbox) Sicherheitskonzept ausreichend?

Hi, ich habe auf meiner Seite mehrere Textboxen. Eine davon ist dazu gedacht um Kommentare zu posten.

Um nun zu verhindern, dass ein Gast schadhaften PHP / HTML oder JavaScript Code einschleust, habe ich für die "Vorschau-Anzeige" eine JavaScript Funktion geschrieben, die alle < > gegen &lt; &gt; austauscht.
Dadurch werden z.B. HTML Befehle nicht mehr ausgeführt, sondern als Text angezeigt.

Als Formatierungshilfe sind BBCodes vorgesehen.

Diese Funktion sieht wie folgt aus und beschränkt sich alleinig auf die Vorschau, die dynamisch innerhalb eines DIV Feldes angezeigt wird:

  
function preview_edit()  
{  
text = document.getElementById(\"textbox\").value;  
text = text.replace(/</g,\"&lt;\");  
text = text.replace(/>/g,\"&gt;\");  
document.getElementById(\"preview_text\").innerHTML = text;  
document.getElementById(\"preview_text\").style.display ='block';  
}  

Nach dem Absenden wird der Text per PHP in ähnlicher Weise nachbearbeitet, bevor er in die Datenbank eingetragen wird.

Ist dies als Schutzmaßnahme ausreichend oder könnte man hier noch etwas verbessern?

Meine Sorgenkind:

1. Mit der FireFox Erweiterung "FireBug" kann ich im Browser den HTML und JavaScript Code manipulieren.
Die Änderungen können zwar nicht in der PHP Datei gespeichert werden, aber kann dadurch trotzdem eine Sicherheitslücke entstehen?
Z.B. indem der Nutzer die JavaScript Prüfung des Vorschaubereiches manipuliert?

Vielen Dank im Vorraus :)

  1. Das roblem an der ganzen Sache ist, dass JavaScript ja nur Clientseitig funktioniert, d.h. wenn der User JS deaktiviert hat, dann wird auch dein "Vorschauschutz" nicht mehr funzen.
    Vor daher wäre es um einiges ratsamer, wenn du eingebaute Funktionen von PHP, wie z.B. htmlspecialchars(), htmlentities() oder, wenns ganz extrem sein darf, strip_tags() verwendest.

    1. Liebe(r) Vyper,

      Vor daher wäre es um einiges ratsamer, wenn du eingebaute Funktionen von PHP, wie z.B. htmlspecialchars(), htmlentities() oder, wenns ganz extrem sein darf, strip_tags() verwendest.

      Wer lesen kann, ist klar im Vorteil, denn Sascha schrieb bereits:

      Nach dem Absenden wird der Text per PHP in ähnlicher Weise nachbearbeitet,
      bevor er in die Datenbank eingetragen wird.

      Liebe Grüße aus Ellwangen,

      Felix Riesterer.

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
      1. Das ist mir bewusst.
        Nur hab ich mich halt gefragt, warum für die Preview Funktion extra so 'ne wackelige JS Funktion, wenn man das eben viel eleganter mit was serverseitigen machen kann...

  2. Lieber Sascha,

    wenn Du auf der Serverseite mit PHP sicherstellst, dass schadhafter Code in maskierter Form abgelegt wird, dann ist das sicher. Dass Du mit JavaScript einen Vorschauservice anbietest, der im Grunde diesen Effekt vorher veranschaulicht, ist dem Benutzer gegenüber sehr nett, aber keineswegs für die (serverseitige!) Sicherheit relevant. Daher wären auch Manipulationen an diesem JavaScript-Mechanismus sicherheitstechnisch irrelevant.

    text = document.getElementById("textbox").value;
    text = text.replace(/</g,"&lt;");
    text = text.replace(/>/g,"&gt;");
    document.getElementById("preview_text").innerHTML = text;
    document.getElementById("preview_text").style.display ='block';

    Warum escapest Du die Anführungszeichen in JavaScript? Das wird wahrscheinlihc zu Fehlern führen! Oder war das nur ein unvorsichtiges Copy&Paste aus PHP-Code heraus?

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

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

      wenn Du auf der Serverseite mit PHP sicherstellst, dass schadhafter Code in maskierter Form abgelegt wird, dann ist das sicher. Dass Du mit JavaScript einen Vorschauservice anbietest, der im Grunde diesen Effekt vorher veranschaulicht, ist dem Benutzer gegenüber sehr nett, aber keineswegs für die (serverseitige!) Sicherheit relevant. Daher wären auch Manipulationen an diesem JavaScript-Mechanismus sicherheitstechnisch irrelevant.

      Liebe Grüße aus Ellwangen,

      Felix Riesterer.

      Lieber Felix,

      Danke für deine Antwort.

      Die Sache ist wie folgt:
      Drückt der Nutzer auf Vorschau wird der Inhalt der Textarea in einem DIV dargestellt und entsprechender Code interpretiert.  Quasi kann er sich seinen Kommentar im Vorraus anschauen und ggf. korrigieren.
      Das würde doch bedeuten, dass ohne Filter auch schadhafter PHP / JS Code interpretiert wird?

      Dies wollte ich mit der JS Funktion unterbinden.

      PS: Die Vorschau läuft über JS und wird dementsprechend ohne Neuladen der Seite generiert, was bedeutet, dass PHP auf die Vorschau keinen Einfluss hat.

      Ich habe leider keine große Ahnung davon was man alles schadhaftes mit einer Textarea anstellen kann, deshalb bin ich vielleicht zu vorsichtig.

      Ich hoffe ich konnte meine Bedenken einigermaßen verständlich rüberbringen?

      Oder war das nur ein unvorsichtiges Copy&Paste aus PHP-Code heraus?

      Erwischt ;)

      Gruß Sascha

      1. Hi,

        Drückt der Nutzer auf Vorschau wird der Inhalt der Textarea in einem DIV dargestellt und entsprechender Code interpretiert.  Quasi kann er sich seinen Kommentar im Vorraus anschauen und ggf. korrigieren.
        Das würde doch bedeuten, dass ohne Filter auch schadhafter PHP / JS Code interpretiert wird?

        Dies wollte ich mit der JS Funktion unterbinden.

        was völlig unsinnig ist, da dieser Code nur vom Schreiber "gesehen" wird und PHP vom Browser ohnehin nicht ausgeführt wird; und sollte der Scheiber schadhaftes Javascript einschleusen wollen, trifft es nur ihn selbst... Du schützt also allenfalls einen Hacker davor, in seine eigene Falle zu tappen.

        Ich habe leider keine große Ahnung davon was man alles schadhaftes mit einer Textarea anstellen kann, deshalb bin ich vielleicht zu vorsichtig.

        Du solltest Deinen Horizont erweitern. Eine Textarea ist ein HTML-Element - nicht mehr.
        Aber wenn Du Formularinhalte in einer MySql-Datenbank verarbeitest, solltest Du die hierfür vorgesehene Schutzfunktion mysql_real_escape_string() anwenden. Und wenn Du die Inhalte später in einer HTML-Seite ausgibst, die hierfür vorgesehene Funktion htmlspecialchars(). Und falls Du eine Usereingabe verlinkt ausgibst, solltest Du zusätzlich auf JS-Eventhandler prüfen - sonst könnte ein generierter Link z.B. auch so aussehen:
        <a href="http://example.org" onmouseover="window.location='http://example.org/trojaner.html">

        Das Rumgehampel mit PHP und JS ist nicht sinnvoll.

        freundliche Grüße
        Ingo

        1. Hi,

          Du solltest Deinen Horizont erweitern. Eine Textarea ist ein HTML-Element - nicht mehr.

          Deshalb bin ich hier ins Forum gekommen.

          Aber wenn Du Formularinhalte in einer MySql-Datenbank verarbeitest, solltest Du die hierfür vorgesehene Schutzfunktion mysql_real_escape_string() anwenden. Und wenn Du die Inhalte später in einer HTML-Seite ausgibst, die hierfür vorgesehene Funktion htmlspecialchars(). Und falls Du eine Usereingabe verlinkt ausgibst, solltest Du zusätzlich auf JS-Eventhandler prüfen - sonst könnte ein generierter Link z.B. auch so aussehen:
          <a href="http://example.org" onmouseover="window.location='http://example.org/trojaner.html">

          Das Rumgehampel mit PHP und JS ist nicht sinnvoll.

          Wie ich eingangs schrieb wird beim Abesenden der Text mit PHP nachbearbeitet. Die Funktionen sind mir bekannt. Ich wollte mich nur vergissern ob es möglich ist, auch, wenn der Code nur vom Schreiber gesehen wird, etwas schadhaftes anzustellen.
          Ich bin kein JS-Profi, deshalb dachte ich mir, dass ich lieber dort nachfrage, wo welche zu finden sind :)

          Dann werde es folgermaßen betrachten:

          Die JS Funktion dient dazu um "html/js Code" innerhalb der Vorschau sichtbar zu machen.

          freundliche Grüße
          Ingo

          Gruß zurück.

    2. echo $begrüßung;

      wenn Du auf der Serverseite mit PHP sicherstellst, dass schadhafter Code in maskierter Form abgelegt wird, dann ist das sicher.

      Maskierungen sind nicht für die Ablage gedacht. Sie sind immer speziell für das jewelige Medium passend zu verwenden, über das die Daten gesendet werden sollen. Auch wenn sie zum Zwecke der Ablage an ein System gesendet werden, ist nur die für den Transport dorthin notwendige Maskierung zu verwenden.

      Es empfiehlt sich, Daten immer in Rohform abzulegen, ohne irgendwelche Maskierungen für irgendwann vielleicht verwendete Medien. Solcherlei behandelte Daten in der Ablage lassen sich nur umständlich weiterverarbeiten, weil davor jedes Mal erst die Maskierung beseitigt werden muss.

      echo "$verabschiedung $name";

  3. Lieber Sascha,

    »»

    wenn Du auf der Serverseite mit PHP sicherstellst, dass schadhafter Code in maskierter Form abgelegt wird, dann ist das sicher. Dass Du mit JavaScript einen Vorschauservice anbietest, der im Grunde diesen Effekt vorher veranschaulicht, ist dem Benutzer gegenüber sehr nett, aber keineswegs für die (serverseitige!) Sicherheit relevant. Daher wären auch Manipulationen an diesem JavaScript-Mechanismus sicherheitstechnisch irrelevant.

    »»
    »»

    Liebe Grüße aus Ellwangen,

    »»

    Felix Riesterer.

    Lieber Felix,

    Danke für deine Antwort.

    Die Sache ist wie folgt:
    Drückt der Nutzer auf Vorschau wird der Inhalt der Textarea in einem DIV dargestellt und entsprechender Code interpretiert.  Quasi kann er sich seinen Kommentar im Vorraus anschauen und ggf. korrigieren.
    Das würde doch bedeuten, dass ohne Filter auch schadhafter PHP / JS Code interpretiert wird?

    Dies wollte ich mit der JS Funktion unterbinden.

    PS: Die Vorschau läuft über JS und wird dementsprechend ohne Neuladen der Seite generiert, was bedeutet, dass PHP auf die Vorschau keinen Einfluss hat.

    Ich habe leider keine große Ahnung davon was man alles schadhaftes mit einer Textarea anstellen kann, deshalb bin ich vielleicht zu vorsichtig.

    Ich hoffe ich konnte meine Bedenken einigermaßen verständlich rüberbringen?

    Oder war das nur ein unvorsichtiges Copy&Paste aus PHP-Code heraus?

    Erwischt ;)

    1. Ich habe leider keine große Ahnung davon was man alles schadhaftes mit einer Textarea anstellen kann, deshalb bin ich vielleicht zu vorsichtig.

      Fixier dich nicht so sehr auf dein Formular, die php seite kann auch von einem Skript aufgerufen werden, z.b. mit Perl kann man so ein Skript schreiben, dass sich exakt so wie ein Browser verhält und die Daten die dabei übertragen werden können beliebig sein. D.h. die Serverseitige Prüfung ist das A&O, das JS in der Vorschau ist nur ein nettes Feature für deine echten Besucher. Letztlich würde ich es aber so wie dedlfix es vorgeschlagen hat machen.

      Struppi.

  4. Hi,

    Um nun zu verhindern, dass ein Gast schadhaften PHP / HTML oder JavaScript Code einschleust,

    Dass PHP-Code clienseitig keine Gefahrenquelle darstellen kann, hatten wir ja nun schon.

    habe ich für die "Vorschau-Anzeige" eine JavaScript Funktion geschrieben, die alle < > gegen &lt; &gt; austauscht.
    Dadurch werden z.B. HTML Befehle nicht mehr ausgeführt, sondern als Text angezeigt.

    Wenn du etwas nur als Text dargestellt haben willst - dann lasse es einfach nur als Text darstellen, dann brauchst du keinerlei Ersetzungen vornehmen.

    text = document.getElementById("textbox").value;
    text = text.replace(/</g,"&lt;");
    text = text.replace(/>/g,"&gt;");
    document.getElementById("preview_text").innerHTML = text;

    Du willst also nicht, dass HTML-Code interpretiert wird - wieso weist du denn den Inhalt dann der innerHTML-Eigenschaft eines Elementes zu?

    Greife einfach auf einen Textknoten innerhalb des Elementes, in dem du das ganze darstellen lassen willst, zu - und weise den Inhalt dessen data-Eigenschaft zu. Da kann der Nutzer so viele < und > eingeben, wie er will - Text bleibt Text.

    MfG ChrisB

    --
    "The Internet: Technological marvel of marvels - but if you don't know *what* you're lookin' for on the Internet, it is nothing but a time-sucking vortex from hell."