Ermöglicht Codeausschnitte in der Formulareingabe und verhindert gleichzeitig XSS- und SQL-Injection-Angriffe

StackOverflow https://stackoverflow.com/questions/407771

Frage

Wie kann man die Eingabe von Codefragmenten in einen Editor (wie Stackoverflow) wie FCKeditor oder einen anderen Editor zulassen und gleichzeitig XSS, SQL-Injection und damit verbundene Angriffe verhindern?

War es hilfreich?

Lösung

Ein Teil des Problems besteht darin, dass Sie bestimmte Arten von HTML zulassen möchten, oder?Links zum Beispiel.Sie müssen jedoch nur die HTML-Tags bereinigen, die möglicherweise XSS-Angriffe wie Skript-Tags oder sogar Event-Handler-Attribute oder ein href oder anderes Attribut enthalten, das mit „javascript:“ beginnt.Daher muss eine vollständige Antwort auf Ihre Frage anspruchsvoller sein als „Sonderzeichen ersetzen“, da dadurch keine Links möglich sind.

Das Verhindern der SQL-Injection hängt möglicherweise etwas von der Wahl Ihrer Plattform ab.Meine bevorzugte Webplattform verfügt über eine integrierte Syntax zum Parametrisieren von Abfragen, die SQL-Injection größtenteils verhindert (cfqueryparam genannt).Wenn Sie PHP und MySQL verwenden, gibt es eine ähnliche native mysql_escape()-Funktion.(Ich bin mir nicht sicher, ob die PHP-Funktion technisch gesehen eine parametrisierte Abfrage erstellt, aber sie hat bei mir bisher gut funktioniert, um SQL-Injection-Versuche zu verhindern, da ich einige gesehen habe, die sicher in der Datenbank gespeichert waren.)

Beim XSS-Schutz habe ich aus diesem Grund früher reguläre Ausdrücke verwendet, um Eingaben zu bereinigen. Seitdem bin ich jedoch von dieser Methode abgerückt, da es schwierig ist, Dinge wie Links zuzulassen und gleichzeitig den gefährlichen Code zu entfernen.Als Alternative bin ich auf XSLT umgestiegen.Auch hier kann die Art und Weise, wie Sie eine XSL-Transformation ausführen, je nach Plattform variieren.Ich hab geschrieben ein Artikel für das ColdFusion Developer's Journal vor einiger Zeit darüber, wie man das macht, was sowohl a Boilerplate-XSL-Blatt Sie können es verwenden und zeigen, wie Sie es mithilfe der nativen XmlTransform()-Funktion mit CF zum Laufen bringen.

Der Grund, warum ich mich dafür entschieden habe, auf XSLT umzusteigen, ist zweierlei.

Durch die erste Validierung, dass es sich bei der Eingabe um wohlgeformtes XML handelt, wird die Möglichkeit eines XSS-Angriffs mithilfe bestimmter String-Verkettungstricks ausgeschlossen.

Zweitens ist es dann einfacher, das XHTML-Paket mit XSL- und XPath-Selektoren zu manipulieren als mit regulären Ausdrücken, da diese speziell für die Arbeit mit einem strukturierten XML-Dokument entwickelt wurden, im Vergleich zu regulären Ausdrücken, die für die reine String-Manipulation entwickelt wurden.Es ist also viel übersichtlicher und einfacher, ich mache seltener Fehler und wenn ich feststelle, dass ich einen Fehler gemacht habe, ist es einfacher, ihn zu beheben.

Als ich sie getestet habe, stellte ich außerdem fest, dass WYSIWYG-Editoren wie CKEditor (er hat das F entfernt) wohlgeformtes XML beibehalten, Sie sollten sich also keine Sorgen darüber machen, dass dies ein potenzielles Problem darstellt.

Andere Tipps

Die gleichen Regeln gelten für Schutz: Filtereingang, Fluchtausgabe.

Bei der Eingabe, die Code enthält, bedeutet das Filtern nur, dass die Zeichenfolge druckbare Zeichen enthalten muss und möglicherweise eine Längengrenze haben.

Verwenden Sie beim Speichern von Text in die Datenbank entweder Abfrageparameter oder entkommen der Zeichenfolge, um sicherzustellen, dass Sie keine Zeichen haben, die SQL -Injection -Schwachstellen erstellen. Code kann mehr Symbole und Nicht-Alpha-Zeichen enthalten, aber diejenigen, auf die Sie in Bezug auf die SQL-Injektion achten müssen, sind dieselben wie für den normalen Text.

Versuchen Sie nicht, die richtige Fluchtfunktion zu duplizieren. Die meisten Datenbankbibliotheken enthalten bereits eine Funktion, die für alle Zeichen korrekt ist, die entkommen müssen (z. B. dies kann datenbankspezifisch sein). Es sollte auch spezielle Probleme mit Charakter -Sets behandeln. Verwenden Sie einfach die von Ihrer Bibliothek bereitgestellte Funktion.

Ich verstehe nicht, warum die Leute sagen "Verwenden Sie gespeicherte Verfahren!" Speichernde Procs bieten keinen besonderen Schutz gegen die SQL -Injektion. Wenn Sie unabgeordnete Werte in SQL -Zeichenfolgen interpolieren und das Ergebnis ausführen, ist dies für die SQL -Injektion anfällig. Es spielt keine Rolle, ob Sie es in Anwendungscode im Vergleich zu einem gespeicherten Proc tun.

Wenn Sie an die Webpräsentation ausgegeben werden, entkommen Sie HTML-Special-Zeichen, wie Sie es mit jedem Text tun würden.

Das Beste, was Sie tun können, um SQL -Injektionsangriffe zu verhindern, ist sicherzustellen, dass Sie bei der Erstellung von Datenbankanrufen parametrisierte Abfragen oder gespeicherte Prozeduren verwenden. Normalerweise würde ich auch empfehlen, eine grundlegende Eingabeeinrichtung durchzuführen, aber da Sie Code vom Benutzer akzeptieren müssen, ist dies möglicherweise keine Option.

Am anderen Ende (wenn die Eingabe des Benutzers in den Browser rendert) führt die HTML -Codierung der Daten zu einem böswilligen JavaScript oder dergleichen. gerendert eher als wörtlicher Text als als wörtlicher Text als hingerichtet Im Browser des Kunden. Jedes anständige Webanwendungsserver -Framework sollte die Fähigkeit haben.

Ich würde sagen, man könnte alle <by <usw. ersetzen (z. B. unter Verwendung von HTMLentities auf PHP) und dann die sicheren Tags mit einer Art Whitelist auswählen. Das Problem ist, dass der Whitelist etwas zu streng sein kann.

Hier ist ein PHP -Beispiel

$code = getTheCodeSnippet();
$code = htmlentities($code);
$code = str_ireplace("&lt;br&gt;", "<br>", $code); //example to whitelist <br> tags
//One could also use Regular expressions for these tags

Um SQL -Injektionen zu verhindern, können Sie alle 'und chars durch ein "innofensives" Äquivalent wie ' und ersetzen, damit die folgende C -Linie

#include <stdio.h>//'); Some SQL command--

Hätte keine negativen Ergebnisse in der Datenbank.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top