Security 使用c:out防止XSS的替代方法
我正在致力于在基于Spring的Java Web应用程序中防止跨站点脚本(XSS)。我已经实现了一个类似于本例的servlet过滤器,它清理应用程序中的所有输入。作为一种额外的安全措施,我还想在所有JSP中清理应用程序的所有输出。我做了一些研究,看看如何做到这一点,并找到了两个互补的选择 其中之一是使用Spring的Security 使用c:out防止XSS的替代方法,security,spring,jsp,xss,jstl,Security,Spring,Jsp,Xss,Jstl,我正在致力于在基于Spring的Java Web应用程序中防止跨站点脚本(XSS)。我已经实现了一个类似于本例的servlet过滤器,它清理应用程序中的所有输入。作为一种额外的安全措施,我还想在所有JSP中清理应用程序的所有输出。我做了一些研究,看看如何做到这一点,并找到了两个互补的选择 其中之一是使用Spring的defaultHtmlEscape属性。这是非常容易实现的(web.xml中有几行),当您的输出通过spring的一个标记(即:message或form标记)时,它非常有效。我发现的
defaultHtmlEscape
属性。这是非常容易实现的(web.xml中有几行),当您的输出通过spring的一个标记(即:message或form标记)时,它非常有效。我发现的另一个选择是不直接使用EL表达式,比如${…}
,而是使用
第二种方法非常有效,但是由于我正在处理的应用程序的大小(200多个JSP文件)。必须用c:out
标记替换EL表达式的所有不适当用法,这是一项非常繁琐的任务。此外,确保所有开发人员都遵守使用c:out
标记的惯例(更不用说代码的不可读性了),这将成为未来一项繁琐的任务
有没有其他方法可以避免EL表达式的输出,从而需要更少的代码修改?因为Servlet 2.5/JSP 2.1,您可以创建一个定制来实现这一点。您可以在中注册它 最后,你可以做逃跑的工作 您唯一的问题是,您将无法在允许的位置显示HTML(即,已经通过某种白名单清除了恶意标记/属性,因此您最终会得到像Jsoup do这样的无辜标记)
也就是说,我不同意您在问题的第一段中提到的通过
过滤器在输入期间转义XSS的必要性。你冒着双重逃跑的危险。你只需要在它可能造成伤害的地方避开它,也就是说,在视图端,它将被内联到HTML中,输出。我建议您摆脱所谓的XSS过滤器,集中精力在视图端修复它,方法是使用JSTL
或fn:escapeXml()
(或自定义EL解析器,但这绝对不是正常的方法)。未来的代码维护者将非常感激 描述一个自定义ELResolver,它转义String类型的EL表达式值。注册此自定义ELResolver将使其转义所有EL表达式的输出。在JSP必须以编程方式输出HTML的例外情况下,您需要一种不涉及EL表达式的机制,例如自定义标记或scriptlet:
<%= "Java expression hopefully returning safe HTML" %>
我同意你不应该对每个变量都使用c:out。
我写了一篇博客,描述了为什么在
这里涉及到很多内容。不要使用fn:escapeXml
来转义HTML。它将生成&apos代码>,它不是标准的HTML实体。@罗兰:不,它不是。它生成'代码>在HTML和XML中都是有效的(就像c:out
)。啊,太好了。所以我一定是把其他的escapeXml
函数弄混了。可以肯定的是,我在JSTL规范中查找了它,其中明确提到了这一点。嗯,我尝试过这样做,但是对JspFactory.getDefaultFactory的调用返回null,您知道我可能丢失了吗?我在Tomcat 6.0.20上运行,使用的是jsp api 2.1 jar。很明显,您的WEB-INF/lib
文件夹中没有任何特定于servletcontainer的jar,对吗?您的web.xml
也是按照Servlet 2.5声明的吗?
<%= "Java expression hopefully returning safe HTML" %>