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
quelle
Antworten:
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 ...
quelle
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:
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 .
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
So bevorzuge ich es. Ich möchte aus verschiedenen Gründen keine Benutzereingaben vor dem Einfügen in die Datenbank ändern.
quelle
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.
quelle
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.
quelle
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).
quelle