Wie führen Sie als Ausgabeformat für die Codierung verwenden filter, um zu verhindern, XSS?
Ich bin mit dem folgenden code im servlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out=response.getWriter();
response.setContentType("text/html");
out.println("<html>");
out.println("<body>");
out.println("<script>alert(1)</script>");
out.println("</body>");
out.println("</html>");
}
Und folgenden code für den filter:
public class SampleFilter implements Filter {
protected FilterConfig config;
public void init(FilterConfig config) throws ServletException {
this.config = config;
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws ServletException, IOException {
long startTime = System.currentTimeMillis();
ServletResponse newResponse = response;
if (request instanceof HttpServletRequest) {
System.out.println("in filter if1");
newResponse = new CharResponseWrapper((HttpServletResponse) response);
}
System.out.println("after filter if1");
chain.doFilter(request, newResponse);
long elapsed = System.currentTimeMillis() - startTime;
if (newResponse instanceof CharResponseWrapper) {
System.out.println("in filter if2");
String text = newResponse.toString();
if (text != null) {
text = SampleFilter.HTMLEntityEncode(text);//.toUpperCase();
response.getWriter().write(text);
}
}
System.out.println("after filter if2");
config.getServletContext().log(" took " + elapsed + " ms");
System.out.println(elapsed);
}
private static String HTMLEntityEncode(String input) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i);
if (Character.isLetterOrDigit(ch) || Character.isWhitespace(ch)) {
sb.append(ch);
} else {
sb.append("&#" + (int)ch + ";");
}
}
return sb.toString();
}
}
Möchte ich, um die folgenden Anzeige von Daten im browser:
<script>alert(1)</script>
vielmehr bin ich immer
<html>
<body>
<script>alert(1)</script>
</body>
</html>
im browser.
Jede Hilfe wird groß sein.
InformationsquelleAutor | 2013-03-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tun Sie es nicht auf die harte Weise. Verwenden Sie einfach JSP für die Generierung der HTML-Ausgabe. Die JSP standard tag library (JSTL) bietet eingebaute Möglichkeiten, um zu entkommen Benutzer-gesteuerte Daten von XSS-Angriff Löcher in den Geschmack von
<c:out>
tag und${fn:escapeXml()}
Funktion..Werden Sie entkommen predefinied XML-Entitäten wie
<
durch>
so, dass es immer völlig harmlos.Servlets sind nicht ausgelegt für die Erzeugung von HTML-Ausgabe. Sie sind darauf ausgelegt, mit dem Zweck die Steuerung der Anfrage - /Antwort.
Siehe auch:
InformationsquelleAutor BalusC
Wenn Sie versuchen, zu verhindern, XSS-Attacken, die Sie haben zu trennen gültigen code aus der potentiell gefährlichen Teile von gültigen Ausdrücken. Es gibt verschiedene Techniken, dies zu erreichen:
Flucht gebundenen Daten: In diesem Fall müssen Sie auf irgendeine Art von templating-Technologie. Anyting definiert in der temeplate als sicher angesehen wird. Im einfachsten Fall werden alle Daten gebunden ist als gefährlich eingestuft und ist deshalb geflüchtet. Eine Lösung dieses einfache ist Snippetory. (Ja, ich entwickeln. Sie können es von Sourceforge oder maven-repo) Die Vorlage könnte wie folgt Aussehen:
Dann die binding-code könnte wie folgt Aussehen:
Jedoch die disadvatage ist, dass der gesamte output der Verarbeitung getan werden muss, die rigtht Weg. Aber ich denke, für ernsthafte Projekte, die dies ist der wichtigste Weg.
Nun einige Ansätze, die verwendet werden könnte, nach der Verarbeitung, jedoch sind in der Regel in Kombination mit der Flucht von gebundenen Daten zu implementieren komplexe Dinge wie das editor-Feld hier auf Stackoverflow:
Weiße Liste: Sie im Wesentlichen die analyse der Daten (vielleicht mit einem html-parser) und die Flucht alles, was nicht Teil eines Tags, das Sie auf Ihrer weißen Liste. Und entfernen Sie jedes Attribut, das Sie nicht zulassen. Das ist ziemlich sicher, aber sehr restriktiv, zu. Darüber hinaus ist es ziemlich Komplex, so kann ich nicht bieten, hier ein Beispiel.
Schwarze Liste: so Ziemlich das gleiche, nur lassen Sie durch das, was nicht auf Ihrem vlack Liste. Wenn Sie vergessen haben, etwas gefährlicher Angriffe sind weiterhin möglich.
InformationsquelleAutor Sir RotN
in Ihrem Fall mit Füller ist unmöglich, da es keine Möglichkeit der Trennung von legitimer Inhalt von allen Inhalten, die gespritzt wurden. heuristische black-box-Verteidigung gegen xss angewendet werden könnten, durch das filtern von input statt output.
Codierung? ja. black-box-Sicherheit? Nein.
Aber da gibt es keine Möglichkeit, die Trennung zwischen den legitimen Inhalten von allen Inhalten, die gespritzt wurden,wie würde dann die Codierung wird und Frucht tragen.
Ich habe nicht alles gesagt über Besondere Frucht. Ich habe keine Ahnung, was Frucht, die Sie benötigen. Es gibt nichts, dass würde verhindern, dass Sie die Kodierung der Ausgabe in irgendeiner Weise Sie wollen (base64, rot13, utf16, ändern alle 'a' in '@', nichts), aber, wie ich bereits sagte, erhalten Sie keine XSS-Schutz auf diese Weise.
InformationsquelleAutor fdreger
Ich habe implementiert eine XSS-Filter für einen Jersey-REST-API. Der code kann leicht extrahiert und angewendet, um eine standard-Java-Filter.
Meisten Menschen empfehlen die Codierung der Ausgangs -, sondern als unsere Daten zugegriffen werden kann durch eine JavaScript-API und es gibt keine Möglichkeit zu garantieren, die unsere Kunden herauszufiltern, XSS-Schwachstellen, entschieden wir uns für die heraus filtern, die XSS-Schwachstellen auf der Eingabe. Ein weiterer Vorteil dieses Ansatzes ist, dass die Filterung erfolgt einmal und nicht jedes mal, wenn Daten ausgegeben werden.
Beachten Sie, dass der filter muss verwendet werden in Verbindung mit JSR 303 s @SafeHtml-annotation, um sicherzustellen, dass die Inhalte von POST-Daten korrekt gefiltert.
Habe ich dokumentiert diese auf meinem blog hier: http://codehustler.org/blog/jersey-cross-site-scripting-xss-filter-for-java-web-apps/
InformationsquelleAutor Alessandro Giannone