Tomcat XSS问题-<;脚本>;URL参数中的标记

Tomcat XSS问题-<;脚本>;URL参数中的标记,tomcat,tomcat7,xss,Tomcat,Tomcat7,Xss,在我的Tomcat7.0.88应用程序中,用户可以将标记放入URL参数中,这显然是XSS的问题。但是,我不知道如何修复它,我希望有一些Tomcat过滤器(本机或第三方)或Java库可以用来解决这个问题,而不是尝试推出我自己的解决方案(这不是一个好主意) 攻击可以在我的应用程序中的URL上执行,如 https://<url>/user_report.jsp?round=3</script><script>alert('1');</script> h

在我的Tomcat7.0.88应用程序中,用户可以将标记放入URL参数中,这显然是XSS的问题。但是,我不知道如何修复它,我希望有一些Tomcat过滤器(本机或第三方)或Java库可以用来解决这个问题,而不是尝试推出我自己的解决方案(这不是一个好主意)

攻击可以在我的应用程序中的URL上执行,如

https://<url>/user_report.jsp?round=3</script><script>alert('1');</script>
https:///user_report.jsp?round=3alert('1');
如果我把这个脚本标签放到亚马逊的一个页面上,他们会对它进行清理并删除它


此外,我甚至不太清楚这将如何触发警报显示,因为该标记不在
标记的任何位置。

必须转义这些字符。对于PHP来说,解决方案很简单,而对于JSP来说,则略有不同

您需要使用
标记。您需要使用转义标记,而不是在页面上显示
${round}

尝试使用
,这将通过将HTML特殊字符转换为实体值来清理页面上打印的内容


请注意,您需要更改我的解决方案以适合您的应用程序。这应该可以做到,但我对JSP应用程序的了解有限。

您必须转义这些字符。对于PHP来说,解决方案很简单,而对于JSP来说,则略有不同

您需要使用
标记。您需要使用转义标记,而不是在页面上显示
${round}

尝试使用
,这将通过将HTML特殊字符转换为实体值来清理页面上打印的内容


请注意,您需要更改我的解决方案以适合您的应用程序。这应该可以做到,但我对JSP应用程序的了解有限。

我应该补充一点,这只是Firefox上的一个问题,因为我使用Tomcat HttpHeaderSecurity过滤器来添加X-XSS-Protection 1;模式=块标题。显然,此标题仅在IE/Edge、Safari和ChromeNope上有效,这是您自己代码中的一个问题:您没有对输入进行清理。XSS保护头只是绷带。正如答案的注释中提到的:XSS可能不是您自己的验证问题,SQL注入是另一个问题。您提供的参数在其他情况下可能完全有效-您可能不需要对其进行清理或转义-基于用户权限,而不是基于包含
标记的事实。我应该补充一点,这只是Firefox上的一个问题,因为我正在使用Tomcat HttpHeaderSecurity过滤器添加X-XSS-Protection 1;模式=块标题。显然,此标题仅在IE/Edge、Safari和ChromeNope上有效,这是您自己代码中的一个问题:您没有对输入进行清理。XSS保护头只是绷带。正如答案的注释中提到的:XSS可能不是您自己的验证问题,SQL注入是另一个问题。您提供的参数在其他情况下可能完全有效-您可能需要也可能不需要对其进行清理或转义-基于用户权限,而不是基于包含
标记的事实。顺便说一句,如果您正在查询数据库中输入的整数对应的数据,检查它是否容易受到SQL注入的攻击,因为这是一个非常严重的问题。知道这一点很好,但我认为这不是我的问题。我从不直接在页面上显示round,而是立即将getParameter(“round”)[0]强制转换为int,因此如果拾取该标记,它将引发异常。如果您没有在页面上显示GET参数的内容,则实际上没有问题。使用的任何形式的用户输入协议都应根据其存储位置进行消毒。一般来说,您应该使用诸如转义和准备语句之类的技术来防止上述漏洞。如果您没有在任何页面上回显GET/POST输入值,那么您就不会受到XSS的攻击(一般来说)。上面的URL显示了在Firefox中加载页面时的警报窗口。这就是我所困惑的…如果我没有在页面上嵌入URL或任何参数,为什么代码会执行。这也意味着它可能容易受到XSS的攻击。当您访问页面时,请转到inspect元素(或查看页面源代码)并检查代码的显示位置。代码必须包含在DOM中才能像这样执行。顺便说一句,如果您正在查询数据库中输入的整数对应的数据,请检查它是否容易受到SQL注入的攻击,因为这是一个非常严重的问题。很高兴知道这一点,但我认为这不是我的问题。我从不直接在页面上显示round,而是立即将getParameter(“round”)[0]强制转换为int,因此如果拾取该标记,它将引发异常。如果您没有在页面上显示GET参数的内容,则实际上没有问题。使用的任何形式的用户输入协议都应根据其存储位置进行消毒。一般来说,您应该使用诸如转义和准备语句之类的技术来防止上述漏洞。如果您没有在任何页面上回显GET/POST输入值,那么您就不会受到XSS的攻击(一般来说)。上面的URL显示了在Firefox中加载页面时的警报窗口。这就是我所困惑的…如果我没有在页面上嵌入URL或任何参数,为什么代码会执行。这也意味着它可能容易受到XSS的攻击。当您访问页面时,请转到inspect元素(或查看页面源代码)并检查代码的显示位置。代码必须包含在DOM中,才能像这样执行。