在Java中添加XSS验证/清理脚本标记

时间:2017-10-17 08:53:59

标签: java xss

我有一个用Java编写的API,我正在进行POST调用,但恶意内容正在发送给API。理想情况下,为防止XSS攻击,API不应接受此类数据,或至少在存储/响应之前对其进行清理。

{"first_name":"<script>alert(document.cookie);</script>","last_name":"
<script>alert(document.cookie);</script>"}

我想在Java中添加XSS验证/清理脚本标记,以防止内容受到XSS攻击。有人能建议在Java中防止XSS攻击的最佳方法吗?有没有办法对上面显示的HTML标签进行编码和解码?

在浏览了不同的文档之后,我发现owasp-java-encoder可以用来编码HTML内容,这个函数可以用来编码HTML内容上下文。

  

&lt;%= Encode.forHtmlContent(UNTRUSTED)   %GT;

我正在寻找能够在存储数据的同时对HTML内容进行编码并在显示数据时对其进行解码的内容。

2 个答案:

答案 0 :(得分:0)

owasp-java-encoder能够做到这一点。

maven依赖如下:

<dependency>
    <groupId>org.owasp.encoder</groupId>
    <artifactId>encoder</artifactId>
    <version>1.2.1</version>
</dependency>

根据您的使用情况,您可以使用以下方法在存储之前对数据进行编码:

//For HTML encoding
String escapedString = org.owasp.esapi.Encoder.encodeForHTML(unescaped_string);

//For HTML Decoding
String unescapedString = org.owasp.esapi.Encoder.decodeForHTML(escaped_string);

编码器的详细文档:https://static.javadoc.io/org.owasp.esapi/esapi/2.0.1/org/owasp/esapi/Encoder.html

如果您保存编码数据,则无需在将其打印回页面时对其进行解码。由于编码数据保存在数据库中,因此在渲染时不应在页面上创建任何xss。

答案 1 :(得分:0)

正如Stephen P所提到的,你通常应该在输出上编码数据。您希望在输出中执行此操作,以确保您使用正确的输出编码,并防止双重编码。 OWASP编码器是一个很好的选择。有关何时使用各种编码器的详细信息,请参阅OWASP XSS Prevention Cheat Sheet

如果可能,您希望尽可能使用白名单验证来验证/清理输入。但对于自由格式文本,您不会在此时进行XSS编码,也不应该这样做。