Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 使用c:out防止XSS的替代方法_Security_Spring_Jsp_Xss_Jstl - Fatal编程技术网

Security 使用c:out防止XSS的替代方法

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标记)时,它非常有效。我发现的

我正在致力于在基于Spring的Java Web应用程序中防止跨站点脚本(XSS)。我已经实现了一个类似于本例的servlet过滤器,它清理应用程序中的所有输入。作为一种额外的安全措施,我还想在所有JSP中清理应用程序的所有输出。我做了一些研究,看看如何做到这一点,并找到了两个互补的选择

其中之一是使用Spring的
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" %>