代码之家  ›  专栏  ›  技术社区  ›  AJM

Java 5 HTML防止XSS的迁移

  •  6
  • AJM  · 技术社区  · 15 年前

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

    我目前有定制的例程,它将转义数据库中存储的任何HTML,以便在我的JSP中安全显示。但是,如果可能的话,我宁愿使用内置/标准方法来实现这一点。

    我目前没有对发送到数据库的数据进行编码,但也希望开始这样做。

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

    3 回复  |  直到 14 年前
        1
  •  9
  •   Community CDub    8 年前

    通常在 显示 ,而不是在 商店 . 在JSP中,您可以使用 JSTL (刚刚下降 jstl-1.2.jar 在里面 /WEB-INF/lib ) <c:out> 标签或 fn:escapeXml 功能。例如。

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

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

    就是这样。如果您在处理输入和/或在数据库中存储的过程中也这样做,那么它将分布在业务代码和/或数据库中。你不应该这样做,这只是维护上的问题,当你在不同的地方(例如 & 将成为 &amp;amp; 而不是 &amp; 这样最终用户就可以看到 &安培; 而不是 & 看来。代码和数据库对XSS不敏感。只有风景。那你就只能逃避它 就在那里 .

    更新 :您已经发布了4个关于同一主题的主题:

    我只会警告你:是的 需要在servlet/filter/javacode/database/whatever中对其进行转义。你只不过是不必要的过度复杂化。只需在显示时退出即可。这就是全部。

        2
  •  5
  •   futtta    15 年前

    不是内置的,但请查看 owasp esapi filter 它应该做你想做的以及更多。它是一个伟大的开源安全库,由OWASP的聪明人和女孩编写(“开放式Web应用程序安全项目”)。

        3
  •  5
  •   Adam Gent    14 年前

    我不得不说,我不同意这个公认的答案,即显然是通过输出来防止XSS。

    我相信更好的方法是对输入进行消毒,这可以通过一个方面很容易实现,这样您就不必把它放在任何地方。 消毒不同于逃跑 .

    你不能盲目逃避:

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

    我建议使用带有方面的OWASP反弹药库或@futta建议的过滤器。

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

    @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提供任何排序RESTAPI。您可以在输出上做正确的事情,但您的mashup伙伴可能不会。

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

    推荐文章