CSRF, XSS und SQL-Injection-Angriffen in JSF
Ich habe eine web-Anwendung gebaut, die auf JSF mit MySQL als DB. Ich habe bereits implementiert der code zum verhindern von CSRF in meiner Anwendung.
Nun, da meine zugrunde liegende framework JSF, ich denke, ich don ' T haben, um XSS-Angriff, wie es bereits gehandhabt UIComponent
. Ich bin nicht mit jedem JavaScript in beliebigen Seiten anzuzeigen. Selbst wenn ich tun, ich brauche wirklich einen code implementieren, XSS-Angriffe zu vermeiden?
Für die DB wir mit prepared statements und gespeicherte Prozeduren in allen DB-Interaktionen.
Gibt es alles, was verarbeitet werden muss für die Verhinderung dieser 3 gewöhnliche Angriffe?
Ich habe bereits durch die OWASP Website und Ihre cheat sheets.
Muss ich kümmern uns um alle anderen potenziellen Angriffsmethoden?
InformationsquelleAutor AngelsandDemons | 2011-10-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
XSS
JSF entworfen, um eingebaute XSS-Prävention. Sie können sicher wieder alle user-controlled input (request-Header (einschließlich cookies!), request-Parameter (auch diejenigen, die gespeichert werden in der DB!) und Antrag stellen (hochgeladen von text-Dateien, etc)) mit beliebigen JSF-Komponente.
Beachten Sie, dass wenn Sie mit JSF 2.0 Facelets, dann können Sie EL im Vorlagen-text etwa so:
Dies wird implizit auch escaped werden. Sie benötigen nicht unbedingt
<h:outputText>
hier.Nur, wenn Sie ausdrücklich unescaping user-controlled input mit
escape="false"
:dann haben Sie eine potentielle XSS-Angriff Loch!
Wenn Sie möchten, um anzuzeigen, benutzergesteuerten Eingabe als HTML, wobei Sie möchten, dass nur eine bestimmte Untermenge von HTML-tags wie
<b>
,<i>
,<u>
usw, dann müssen Sie bereinigen Sie die Eingabe, indem Sie eine whitelist. Der HTML-parser Jsoup ist sehr hilfreich.itemLabelEscaped
Fehler in Mojarra < 2.2.6Älteren Mojarra Versionen vor 2.2.6 hatte den Fehler bei dem
<f:selectItems itemLabel>
falsch rendert das label ohne Umschreibung, wenn einList<T>
über<f:selectItems var>
stattList<SelectItem>
oderSelectItem[]
als Wert (Problem 3143). In anderen Worten, wenn Sie redisplaying Benutzer-gesteuerte Daten als Element-labels über einList<T>
sind, dann haben Sie eine potentielle XSS-Loch. Wenn Sie ein Upgrade auf mindestens Mojarra 2.2.6 ist nicht eine option, dann müssen Sie explizit festlegenitemLabelEscaped
Attributtrue
zu verhindern.CSRF
JSF 2.x hat bereits eingebauten CSRF-Prävention im Geschmack von
javax.faces.ViewState
hidden-Feld im Formular bei der Verwendung von server-side-state-saving. In JSF 1.x dieser Wert war nämlich ziemlich schwach und zu leicht vorhersehbar (es war eigentlich nie beabsichtigt, als CSRF prevention). In JSF 2.0 wurde verbessert und mit einem langen und starken, automatisch generierten Wert statt einer eher vorhersehbaren Sequenz-Wert und ist somit eine robuste CSRF prevention.In JSF 2.2 wird dies noch weiter verbessert werden, indem diese zu einem gewünschten Teil der JSF-Spezifikation, zusammen mit einer konfigurierbaren AES-Schlüssel, der zum verschlüsseln der client-Seite Stand, bei client-side-state-saving wird aktiviert. Siehe auch JSF-spec Problem 869 und Die Wiederverwendung von ViewState-Wert in der anderen Sitzung (CSRF). Neu in JSF 2.2 ist CSRF-Schutz auf GET-Anfragen durch
<geschützt-Ansichten>
.Nur, wenn Sie stateless views als in
<f:view transient="true">
oder gibt ' s irgendwo ein XSS-Angriff Loch in die Anwendung, dann haben Sie ein potential CSRF-Angriff Loch.SQL-injection
Dies ist nicht die JSF Verantwortung. Wie um dies zu verhindern, hängt von der Persistenz-API, die Sie verwenden (raw JDBC, modernen GMP oder good ol' Hibernate), aber alles läuft darauf hinaus, dass Sie sollten nie verketten Benutzer-gesteuerte Eingabe in SQL-Zeichenfolgen, wie so
Sich vorstellen, was passieren würde, wenn der enduser wählt die folgenden Namen:
Sollten Sie immer Verwendung von parametrisierten Abfragen, wo anwendbar.
In plain JDBC, die Sie verwenden müssen
PreparedStatement
zu füllen, die die Werte der parameter und in der PPV (und Hibernate), dieQuery
Objekt bietet setter für diese als gut.Nun, ich kann Ihnen nicht genug danken für diese Super Erklärung..Aber ich habe einige Zweifel. In meiner GUI ich verwenden <h:outputText value="#{user.name}" escape="false" /> für die Anzeige auf der GUI..das ist Nun eine potenzielle XSS-Angriff.Wie vermeide ich es.??. Zweitens, ich bin trotzdem mit JSF 1.2 und so, wie ich mit CSRF dann?.Ich verwendet WebScrarab-tool zum abfangen von Http-Request und ändern Sie den Wert, und es war in der Tat erfolgreich.Bedeutet es, dass die Anwendung ist anfällig für Angriff.Wie kann ich es vermeiden. Ich habe bereits verarbeitet SQL-injection. Einzige Sorge ist für mich, XSS-und CSRF-Angriffe wie jetzt..Bitte um Hilfe.
Auch die Begründung von Samuel schlagen Sie mich, um einen Blick auf die Schließung Vorlage für die Desinfektion der HTML-Eingabe. Aber ich habe gehört, dass die Schließung Vorlage hat ernsthafte performance-Problem und ausserdem ist es von Google Labs, so wird es fast in der Beta version, daher nicht stabil...Welches empfehlen Sie für die HTMl-santizing..Jsoup oder Schließung..ich bin absolut neu in diesem santizing und-Analyse und daher würde ich lieber etwas, das leicht zu erlernen und umzusetzen.
Wie XSS, entfernen Sie einfach
escape="false"
. Oder wenn Sie wollen es zulassen, daß bestimmte HTML -, verwenden Sie dann Jsoup. Sie brauchen nur zu tunString safe = Jsoup.clean(unsafe, Whitelist.basic());
. Siehe auch dieser Anleitung. Sie können dies tun, direkt vor dem speichern die Eingabe in DB. Wie CSRF prevention in JSF 1.x, Sie sollten pflegen eine session-basierte anti-CSRF-token in der form (im Grunde eine versteckte input-Feld mit einem langen/automatisch generierte/unberechenbar-Wert). Seam framework hat eine ähnliche Komponente<s:token>
: seamframework.org/Documentation/CrossSiteRequestForgeryÜbrigens, wenn du mit JSF 1.2, warum hast du tag JSF 2.0 auf die Frage?
InformationsquelleAutor BalusC
Können Sie anfällig für XSS-auch wenn Sie nicht verwenden JavaScript in Ihre Seiten. XSS tritt auf, wenn Sie integrieren die Inhalte vom Angreifer kontrolliert, ohne richtig codiert.
Immer, wenn Sie etwas tun, wie
wo kann ein Angreifer
x
enthalten HTML mit JavaScript, dann sind Sie anfällig für XSS.Die Lösung ist in der Regel nicht zu schreiben, die große Mengen von code. In der Regel die Lösung ist die Codierung der
$x
und alle anderen Werte vom Angreifer kontrolliert, bevor Sie in die HTML generieren.Filtern oder Desinfektion Eingänge können helfen, eine zusätzliche Schicht von Schutz.
<shameless-plug>
Können Sie auch eine template-Sprache, die Ausgabe codiert automatisch zum Schutz gegen XSS.
Schließung Vorlage ist eine solche option für Java.
BEARBEITEN
Da man sich mit JSF-Sie sollten Lesen, auf XSS-Minderung in JSF:
Gibt es einen bestimmten Satz, den Sie finden das verwirrend?
Problem ist, ich bin mit JSF und ich denke genauso wie die anderen frameworks automatisch generiert HTML..Also ich bin immer noch ratlos über das, was Ihr geschrieben..ich ging auch durch die Schließung Vorlage..Es ist so neu für mich...
Auch hinzufügen:- Meine GUI wird nicht zulassen, dass der Benutzer zur Eingabe der Spitzen Klammer tags<>.Es wird scheitern, client-seitige Validierung und die Anfrage nicht bearbeitet werden..Wie ich verstanden habe, WENN ich ERLAUBEN dem BENUTZER, geben Sie HTML-tags in meiner GUI ich dann verwenden müssen, die Schließung Vorlage, um sicherzustellen, das alle gültigen tags und die sind alle nicht gültig...Bitte korrigieren Sie mich, wenn falsch bin.
Anders als bei altmodischen JSP/Servlet, JSF hat nicht wirklich ein Konzept
response.write(foo)
. Diese Antwort ist ein wenig verwirrend, sich an Anwender, die neu in JSF 2.x.InformationsquelleAutor Mike Samuel