Java 5 HTML转义To Prevent XSS

时间:2010-02-25 11:28:16

标签: java jsp xss

我正在研究Java应用程序中的一些XSS预防。

我目前有自定义构建的例程,它将转义存储在数据库中的任何HTML,以便在我的jsps中安全显示。但是,如果可能,我宁愿使用内置/标准方法来执行此操作。

我目前没有编码发送到数据库的数据,但也想开始这样做。

是否有任何内置方法可以帮助我实现这一目标?

3 个答案:

答案 0 :(得分:9)

您通常在显示期间逃避XSS,而不是在商店期间。在JSP中,您可以使用JSTL(只需在/WEB-INF/libjstl-1.2.jar标记或<c:out>功能中删除fn:escapeXml即可。 E.g。

<input name="foo" value="<c:out value="${param.foo}" />">

<input name="foo" value="${fn:escapeXml(param.foo)}">

就是这样。如果您在处理输入和/或存储在DB中时也这样做,那么它全部分布在业务代码和/或数据库中。你不应该这样做,这只是维护上的麻烦,当你在不同的地方做这件事时你会冒双重逃避或更多的风险(例如&会变成&amp;amp;而不是&amp;所以enduser会在视图中看到&amp;而不是&。代码和数据库对XSS不敏感。只有视图是。你应该只在那里转义它。

更新:您发布了有关同一主题的4个主题:

我只会警告你:需要在servlet / filter / javacode / database /中转义它。你只是不必要地使事情过于复杂。在显示期间逃脱它。就是这样。

答案 1 :(得分:5)

不是内置的,但请查看owasp esapi filter,它应该做您正在寻找的内容以及更多内容。它是由Owasp(“开放式Web应用程序安全项目”)的聪明人和女孩编写的一个很好的开源安全库。

答案 2 :(得分:5)

我不得不说我不同意接受的答案显然是为了防止XSS逃避输出。

我认为更好的方法是对输入进行消毒,这可以通过一个方面轻松实现,这样您就不必将其全部放在一起。 消毒不同于逃避

你不能盲目逃避:

  • 您可能希望用户输入HTML的子集(也称为链接和粗体标记)。
  • 转义不会阻止XSS

我建议使用带有Aspect或@ futtta推荐过滤器的OWASP Antisammy库。

下面是我使用Spring MVC注释来清理用户输入的一个方面(因为我们将它用于所有输入)。

@SuppressWarnings("unused")
@Aspect
public class UserInputSanitizerAdivsor {

    @Around("execution(@RequestMapping * * (..))")
    public Object check(final ProceedingJoinPoint jp) throws Throwable {
        Object[] args = jp.getArgs();
        if (args != null) {
            for (int i = 0; i < args.length; i++) {
                Object o = args[i];
                if (o != null && o instanceof String) {
                    String s = (String) o;
                    args[i] = UserInputSanitizer.sanitize(s);
                }
            }
        }
        return jp.proceed(args);
    }
}

您仍然必须在非富文本字段的输出中转义,但您永远不会(我相信永远不会)在您的数据库中包含恶意数据。

如果您不想对某些输入进行消毒,您可以随时进行注释,使该方面不会消毒。

您不希望数据库中存在恶意数据的另一个原因是您向Internet提供任何排序​​的REST API。您可以在输出上做正确的事情,但您的mashup合作伙伴可能不会。

清理输入或阻止输入是否正常(我的意思是大多数人都有文件上传限制吗?)。 Web应用程序中的大多数字段都不需要输入脚本标记,更重要的是,大多数用户可能不需要或不想输入脚本标记(显然例外是堆栈溢出答案)。