Java 5 HTML转义为防止XSS
我正在研究Java应用程序中的一些XSS预防。
我目前有自定义的例程,它将转义存储在数据库中的任何HTML,以便在我的jsps中安全显示。 但是,如果可能的话,我宁愿使用内置/标准方法来执行此操作。
我目前没有编码发送到数据库的数据,但也希望开始这样做。
有没有内置的方法可以帮助我实现这一目标?
您通常在显示期间逃避XSS,而不是在存储期间。 在JSP中,您可以使用JSTL (只需在/WEB-INF/lib
删除jstl-1.2.jar )
标记或fn:escapeXml
函数。 例如
">
要么
而已。 如果您在处理输入和/或存储在数据库中时也这样做,那么它全部分布在业务代码和/或数据库中。 你不应该这样做,它只是维护麻烦,当你在不同的地方做这件事时你会冒险双重逃避或更多(例如&
将成为&
而不是&
以便最终用户真正看到&
而不是代码和数据库对XSS不敏感。只有视图是。你应该只在那里转义它。
更新 :您发布了4个关于同一主题的主题:
- 跨站点脚本 – 隐藏表单域
- HttpServletRequest – 编码url和隐藏字段参数的快速方法
- HttpServletRequest – SetParameter
- 这个。
我只会警告你:你不需要在servlet / filter / javacode / database /中转义它。 你只是不必要地使事情过于复杂。 在显示期间逃脱它。 就这样。
不是内置的,但检查owasp esapifilter ,它应该做你想要的和更多。 它是由Owasp(“开放Web应用程序安全项目”)的聪明人和女孩编写的一个伟大的开源安全库。
我不得不说我非常不同意接受的答案显然是为了防止XSS逃避输出。
我认为更好的方法是对输入进行消毒,这可以通过一个方面轻松实现,这样您就不必将其全部放在一起。 消毒不同于逃避 。
你不能盲目逃避:
- 您可能希望用户输入HTML的子集(也称为链接和粗体标记)。
- 转义不会阻止XSS
我建议使用带有Aspect或@ futtta推荐filter的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,则您不希望数据库中存在恶意数据的另一个原因。 你可以在输出上做正确的事,但你的混搭伙伴可能没有。
消毒输入或阻止输入是可以的(我的意思是大多数人都有文件上传限制吗?)。 Web应用程序中的大多数字段不需要输入脚本标记,更重要的是,大多数用户可能不需要或不想输入脚本标记(显然例外是堆栈溢出答案)。