Was machen Sie, wenn ein Kunde Rich Text Editing auf seiner Website benötigt?

18

Wie wir alle wissen, sind XSS-Angriffe gefährlich und sehr einfach durchzuführen . Verschiedene Frameworks erleichtern das Codieren von HTML-Code, wie dies in ASP.NET MVC der Fall ist:

<%= Html.Encode("string"); %>

Aber was passiert, wenn Ihr Client verlangt, dass er seinen Inhalt direkt aus einem Microsoft Word-Dokument hochladen kann?

Hier ist das Szenario: Benutzer können Inhalte aus Microsoft Word in einen WYSIWYG-Editor (in diesem Fall tinyMCE ) kopieren und einfügen. Diese Informationen werden dann auf einer Webseite veröffentlicht.

Die Website ist öffentlich, aber nur Mitglieder dieser Organisation können Informationen auf einer Webseite veröffentlichen.

Wie gehe ich sicher mit diesen Anforderungen um? Momentan wird nicht überprüft, was der Client veröffentlicht (da nur "vertrauenswürdige" Benutzer veröffentlichen können), aber ich bin nicht besonders zufrieden damit und würde es gerne weiter sperren, falls ein Konto gehackt wird.

Die einzige konzeptionelle Methode, von der ich weiß, dass sie diese Anforderungen erfüllt, besteht darin, HTML-Tags auf die Whitelist zu setzen und sie durchzulassen . Gibt es eine andere Art und Weise? Wenn nicht, wie kann der Benutzer Eingaben in beliebiger Form in der Datenbank speichern, aber nur korrekt codiert anzeigen und fehlerhafte Tags entfernen?

Verwandte Frage

Verhindern von Cross Site Scripting (XSS)

George Stocker
quelle
Schöne Frage - hier ist eine ähnliche Frage
stackoverflow.com/questions/445177/…
Einverstanden. Es ist ähnlich, aber es ist eine verwirrende Frage (die Frage ist schwer zu finden), und es wird nicht speziell gefragt, ob es einen anderen Weg gibt. Wenn es eine andere Möglichkeit gibt, HTML zu rendern, ohne eine Whitelist erstellen zu müssen, geht es mir darum. Wenn es eine ASP.NET MVC View Engine gibt, die sich darum kümmert, ist das auch gut zu wissen.
George Stocker
Nicht sicherheitsrelevant ist, dass das Filtern von Tags aus Sicht der Benutzeroberfläche möglicherweise hilfreich ist. Es ist sehr einfach, versehentlich eine spitze Klammer einzugeben und zu vergessen, sie zu entfernen. Da es sich um Benutzer handelt, die aus Word kopieren, ist es eine gute Idee, schlechte Tags zu erkennen und sie entsprechend zu codieren (dh & amp; lt;), damit die Dinge einfach funktionieren.
Zu Punkt 4: Wetten, dass es immer noch ein Problem ist? Schließlich sind die meisten Hacks ein Insider-Job. Für einen bestimmten Editor hatte ich viel Glück mit FreeTextBox, aber ich kann nicht sagen , wie gut es Ihren Anforderungen entspricht, insbesondere MVC.
Joel Coehoorn
1
@gnat Danke; bearbeitet. Sieht so aus, als hätte meine Frage die Aufmerksamkeit einer Art Kabale auf sich gezogen. drei Abstimmungen in schneller Folge und Ihre Schutz- und Bearbeitungsanfrage.
George Stocker

Antworten:

8

Der einfachste Weg (für Sie als Entwickler) ist wahrscheinlich, eine von vielen Varianten von Markdown zu implementieren , zum Beispiel Markdown.NET oder, noch besser (imho), einen WMD-Editor .

Dann könnten Ihre Benutzer einfaches HTML einfügen, aber nichts Gefährliches. Sie könnten eine Vorschau der eingegebenen Daten anzeigen und eventuelle Skrupel beseitigen, noch bevor sie etwas veröffentlichen ...

Tomas Aschan
quelle
Ich glaube, StackOverflow verwendet einen benutzerdefinierten Editor ohne WMD-Syntax
Jon
Was meinst du mit WMD-Syntax? Soweit ich das beurteilen kann, funktioniert die gesamte WMD-Syntax. Und ich habe noch nichts gefunden, was nicht funktioniert ...
2
Das Problem bei der Verwendung von Markdown ist, dass Markdown beliebiges HTML zulässt. es ist also keine Lösung für sich.
George Stocker
7

Whitelisting ist in der Tat die beste Möglichkeit, XSS-Angriffe zu verhindern, wenn Benutzer HTML direkt oder mit einem Rich-Text-Editor eingeben können.

Zu Ihren anderen Fragen:

Gibt es einen WYSIWYG-Editor, der die Möglichkeit bietet, Whitelists im laufenden Betrieb zu erstellen?

Ich glaube nicht, dass das funktionieren könnte. Sie benötigen dazu serverseitigen Code und die RTE läuft auf dem Client.

TinyMCE filtert Tags, wenn Sie möchten, aber da dies im Browser geschieht, können Sie ihm nicht vertrauen. Siehe extended_valid_elements . TinyMCE (Moxie) schlägt ebenfalls eine Whitelist vor, siehe hier .

Sollte ich mir darüber überhaupt Sorgen machen, da es nur für "private Entsendung" ist?

Sie sollten HTML immer filtern, es sei denn, es gibt bestimmte Gründe, dies nicht zu tun (sehr selten). Einige Gründe: a) Funktionen, die heute für interne Benutzer und morgen für die Öffentlichkeit verfügbar sind, b) unbefugter Zugriff haben geringere Auswirkungen

ist die beste Möglichkeit, sie in irgendeiner Form in der Datenbank speichern zu lassen, aber nur richtig codiert und ohne fehlerhafte Tags anzuzeigen?

So bevorzuge ich es. Ich möchte aus verschiedenen Gründen keine Benutzereingaben vor dem Einfügen in die Datenbank ändern.

Daremon
quelle
-1

Ich mache das Gleiche. Ich benutze TinyMCE und erlaube das Einfügen aus Word-Dokumenten. Nur bestimmte Personen, die die Site warten, können dies über einen Administrationsbereich tun. Dies wird durch die ASP.Net-Mitgliedschaft sichergestellt. Ich mache einfach den HTML.Encode, wenn er an die öffentliche Site gesendet wird.

Sie können den folgenden Code verwenden, wenn Sie möchten, bevor er in die Datenbank aufgenommen wird. Sie sind sich jedoch nicht sicher, welche Auswirkungen er auf Sie hat. Möglicherweise müssen Sie mit Ihrer Whitelist gehen.

 /// <summary>
    /// Strip HTML
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static string StripHTML(string str)
    {
        //Strips the HTML tags from strHTML 
        System.Text.RegularExpressions.Regex objRegExp = new System.Text.RegularExpressions.Regex("<(.|\n)+?>");

        // Replace all tags with a space, otherwise words either side 
        // of a tag might be concatenated 
        string strOutput = objRegExp.Replace(str, " ");

        // Replace all < and > with < and > 
        strOutput = strOutput.Replace("<", "<");
        strOutput = strOutput.Replace(">", ">");

        return strOutput;
    }
Jon
quelle
Wenn sie Text wie <script> alert ("hey") </ script> speichern und Sie Html.Encode (<script> alert ("hey") </ script>) ausführen, wird nur gedruckt, dass die Seite nicht ausgeführt wird alert
Jon
Ich verwende keine Whitelist, sondern speichere sie nur so, wie sie ist. Die obige Funktion könnte helfen, aber ich weiß nicht, welche Auswirkungen es haben wird. Würde gerne wissen, was Sie sich entscheiden. Warum ist mein Beitrag als negativ markiert?
Jon
1
Ich denke, das liegt daran, dass die Art und Weise, wie Ihre Software dies tut, eine sehr naive Implementierung ist. Es gibt alle Arten von Tricks, die Ihre Implementierung umgehen.
George Stocker
4
Eine Whitelist ist eine gute Idee, aber Ihre Methode sicherlich nicht. Regex ist kein zuverlässiger Weg, um Tags in Text zu erkennen, da HTML ziemlich verschleiert werden kann. Viel besser ist es, eine Bibliothek wie das HTML Agility Pack zu verwenden.
Noldorin
-1

Eine Option könnte das HTML-Bearbeitungssteuerelement für .NET sein (das ich geschrieben habe).

Es handelt sich um einen WYSIWYM-HTML-Editor für .NET, der nur eine Teilmenge der HTML-Elemente (ohne <script>Elemente) unterstützt. Auf diese Weise fungiert er als Whitelist.

Wenn es für den internen Gebrauch vorgesehen ist (z. B. eine Intranetsite), kann das Steuerelement in eine Webseite eingebettet werden .

Ich habe keine Unterstützung für das Einfügen aus Word integriert, aber ich habe eine Komponente, die einen Schritt in diese Richtung darstellt: einen Doc to HTML-Konverter ; Ich habe also die Bausteine, die Sie in ASP.NET verwenden können, um ein Dokument in HTML zu konvertieren, das HTML im Editor anzuzeigen usw.

ChrisW
quelle
-2

Mein IMHO vertraut weiterhin Ihren Nutzern, bis Sie an die Börse gehen.

Nun, es gibt keinen zuverlässigen Weg, um Ihre Bedürfnisse zu erfüllen. Beispielsweise kann kein WYSIWYG-Editor Formulare schützen, in die Bilder mit URLs (indirekter Verwendungsnachweis, unzulässiger Inhalt) oder Text (unzulässiger Text, falsch geschriebener Text, unzulässiger Text) eingefügt werden.

Mein Standpunkt ist, wenn Sie Ihren Benutzern vertrauen können, lassen Sie einfach alles zu und warnen Sie die Benutzer, wenn Sie wissen, dass gefährliche Markups vorhanden sind (um Fehler zu vermeiden).

Wenn Sie nicht vertrauen, verwenden Sie eine Art spezielles Markup (z. B. Markdown).

In meinem Projekt verwenden wir spezielle Typen für potenziell gefährliche Inhalte und spezielle Methoden zum Rendern und Akzeptieren solcher Inhalte. Dieser Code hat in unserem Thread-Modell eine hohe Punktzahl und die Aufmerksamkeit ist sehr hoch (zum Beispiel sollte jede Änderung von zwei unabhängigen Codierern überprüft werden, wir haben eine umfassende Testsuite und so weiter).

Mike Chaliy
quelle