it-swarm.com.de

Verhinderung von CSRF-, XSS- und SQL-Injection-Angriffen in JSF

Ich habe eine Webanwendung, die auf JSF mit MySQL als DB basiert. Ich habe den Code bereits implementiert, um CSRF in meiner Anwendung zu verhindern.

Da mein zugrunde liegendes Framework JSF ist, muss ich XSS-Angriffe vermutlich nicht mehr ausführen, da diese bereits von UIComponent ausgeführt werden. Ich verwende kein JavaScript auf einer der Ansichtsseiten. Auch wenn ich verwende, muss ich wirklich Code implementieren, um XSS-Angriffe zu verhindern?

Für DB verwenden wir vorbereitete Anweisungen und gespeicherte Prozeduren in allen DB-Interaktionen.

Muss noch etwas unternommen werden, um diese drei häufigen Angriffe zu verhindern? Ich habe bereits die Seite OWASP und ihre Spickzettel durchgesehen.

Muss ich mich um andere potenzielle Angriffsmethoden kümmern?

54
AngelsandDemons

XSS

JSF wurde für die integrierte XSS-Prävention entwickelt. Sie können alle benutzergesteuerte Eingaben (Anforderungsheader (einschließlich Cookies!), Anforderungsparameter (auch diejenigen, die in DB gespeichert sind!) Und Anforderungskörper (hochgeladene Textdateien usw.) wieder anzeigen, indem Sie verwenden eine beliebige JSF-Komponente.

<h:outputText value="#{user.name}" />
<h:outputText value="#{user.name}" escape="true" />
<h:inputText value="#{user.name}" />
etc...

Beachten Sie, dass Sie bei Verwendung von JSF 2.0 für Facelets EL in Vorlagentexten wie folgt verwenden können:

<p>Welcome, #{user.name}</p>

Dies wird auch implizit übergangen. Sie brauchen hier nicht unbedingt <h:outputText>.

Nur wenn Sie explizit Unescaping Benutzergesteuerte Eingabe mit escape="false":

<h:outputText value="#{user.name}" escape="false" />

dann hast du ein potenzielles XSS-Angriffsloch!

Wenn Sie benutzergesteuerte Eingaben erneut als HTML anzeigen möchten, wobei Sie nur eine bestimmte Teilmenge von HTML-Tags wie <b>, <i>, <u> Usw. zulassen möchten, Dann müssen Sie die Eingabe über eine Whitelist bereinigen. Der HTML-Parser Jsoup ist dabei sehr hilfreich .

itemLabelEscaped Fehler in Mojarra <2.2.6

Ältere Mojarra-Versionen davor 2.2.6 hatten den Fehler, dass <f:selectItems itemLabel> Das Etikett fälschlicherweise ohne Strichmarkierung darstellt, wenn ein List<T> Über <f:selectItems var> Anstelle von List<SelectItem> Oder SelectItem[] Als Wert ( issue 314 ). Mit anderen Worten, wenn Sie benutzergesteuerte Daten als Artikelbezeichnungen mit einem List<T> Erneut anzeigen, besteht die Gefahr einer XSS-Lücke. Wenn ein Upgrade auf mindestens Mojarra 2.2.6 nicht möglich ist, müssen Sie das Attribut itemLabelEscaped explizit auf true setzen, um dies zu verhindern.

<f:selectItems value="#{bean.entities}" var="entity" itemValue="#{entity}"
    itemLabel="#{entity.someUserControlledProperty}" itemLabelEscaped="true" />

CSRF

JSF 2.x hat bereits eine CSRF-Prävention im Stil von javax.faces.ViewState Ausgeblendeten Feldern im Formular eingebaut, wenn die serverseitige Statusspeicherung verwendet wird. In JSF 1.x war dieser Wert nämlich ziemlich schwach und zu leicht vorhersehbar (eigentlich war er nie als Liquorprävention gedacht). In JSF 2.0 wurde dies verbessert, indem ein langer und starker autogenerierter Wert anstelle eines eher vorhersagbaren Sequenzwerts verwendet wurde, was es zu einer robusten CSRF-Prävention macht.

In JSF 2.2 wird dies noch weiter verbessert, indem es zusammen mit einem konfigurierbaren AES-Schlüssel zum Verschlüsseln des clientseitigen Status zum erforderlichen Teil der JSF-Spezifikation gemacht wird, falls das Speichern des clientseitigen Status aktiviert ist. Siehe auch JSF-Spezifikation 869 und Wiederverwenden des ViewState-Werts in einer anderen Sitzung (CSRF) . Neu in JSF 2.2 ist der CSRF-Schutz für GET-Anforderungen durch <protected-views> .

Nur wenn Sie zustandslose Ansichten wie in <f:view transient="true"> Verwenden oder die Anwendung irgendwo eine XSS-Angriffslücke aufweist, besteht die Möglichkeit einer CSRF-Angriffslücke.


SQL-Injektion

Dies liegt nicht in der Verantwortung von JSF. Wie dies verhindert werden kann, hängt von der von Ihnen verwendeten Persistenz-API ab (unformatiertes JDBC, modernes JPA oder guter alter Ruhezustand), aber alles läuft darauf hinaus, dass Sie nie benutzergesteuerte Eingaben in SQL-Zeichenfolgen verketten wie so

String sql = "SELECT * FROM user WHERE username = '" + username + "' AND password = md5(" + password + ")";
String jpql = "SELECT u FROM User u WHERE u.username = '" + username + "' AND u.password = md5('" + password + "')";

Stellen Sie sich vor, was passieren würde, wenn der Endbenutzer den folgenden Namen wählt:

x'; DROP TABLE user; --

Sie sollten immer gegebenenfalls parametrisierte Abfragen verwenden.

String sql = "SELECT * FROM user WHERE username = ? AND password = md5(?)";
String jpql = "SELECT u FROM User u WHERE u.username = ?1 AND u.password = md5(?2)";

In normaler JDBC müssen Sie PreparedStatement verwenden, um die Parameterwerte zu füllen, und in JPA (und Ruhezustand) bietet das Objekt Query Setter auch dafür.

106
BalusC

Ich verwende kein JavaScript auf einer der Ansichtsseiten. Selbst wenn ich verwende, muss ich wirklich Code implementieren, um XSS Attack zu umgehen.

Sie können anfällig für XSS sein, selbst wenn Sie auf Ihren Seiten kein JavaScript verwenden. XSS tritt auf, wenn Sie von einem Angreifer kontrollierten Inhalt einbinden, ohne ihn ordnungsgemäß zu codieren.

Immer wenn du so etwas machst

response.write("<b>" + x + "</b>")

wenn ein Angreifer dazu führen kann, dass x HTML mit JavaScript enthält, sind Sie für XSS anfällig.

Die Lösung besteht normalerweise darin, keine großen Mengen an Code zu schreiben. In der Regel besteht die Lösung darin, $x und alle anderen von einem Angreifer kontrollierten Werte, bevor Sie sie in den von Ihnen generierten HTML-Code einfügen.

response.write("<b>" + escapePlainTextToHtml(x) + "</b>")

Durch Filtern oder Desinfizieren von Eingaben kann eine zusätzliche Schutzschicht bereitgestellt werden.

<shameless-plug>

Sie können auch eine Vorlagensprache verwenden, die die Ausgabe zum Schutz vor XSS automatisch codiert.

Closure Template ist eine solche Option für Java.

Die kontextbezogene automatische Cap-Funktion erweitert Closure Templates, um jeden dynamischen Wert basierend auf dem Kontext, in dem er angezeigt wird, ordnungsgemäß zu codieren, und schützt so vor XSS-Schwachstellen in Werten, die von einem Angreifer gesteuert werden.

BEARBEITEN

Da Sie JSF verwenden, sollten Sie sich über XSS-Schadensbegrenzung in JSF informieren :

Ausgabetext schließen

<h:outputText/> und <h:outputLabel/> hat das Escape-Attribut standardmäßig auf True gesetzt. Indem Sie dieses Tag zum Anzeigen von Ausgaben verwenden, können Sie einen Großteil der XSS-Sicherheitsanfälligkeit ausgleichen.

SeamTextParser und <s:formattedText/>

Wenn Sie Benutzern erlauben möchten, einige der grundlegenden HTML-Tags zum Anpassen ihrer Eingaben zu verwenden, bietet JBoss Seam ein <s:formattedText/>-Tag, das einige grundlegende HTML-Tags und -Stile zulässt, die von Benutzern angegeben wurden.

8
Mike Samuel