我们在代码上运行了Fortify源扫描。在许多地方,它显示了严重的问题/违规行为:
跨站点脚本:已反映 - 方法_jspService() WorkSheet.jsp将未经验证的数据发送到第368行的Web浏览器, 这可能导致浏览器执行恶意代码。
第368行是
subNum="<%=submissionNo%>";
我们使用
获取 submissionNoString submissionNo = request.getParameter("SUBMISSIONNO");
有没有办法在不使用JSTL的情况下解决这个问题,或者JSTL是唯一的选择吗?
答案 0 :(得分:0)
查看@jcoppens给出的URL,并记住这一条主要规则:在出路上进行输入验证并在出路时进行编码。
查看OWASP Stinger的输入和OWASP ESAPI或OWASP JEP的编码替代方案,不要推出自己的验证框架。
不要在客户端执行输入验证,它太容易绕过。
除非您绝对可以保证不会恶意修改任何数据,否则不要将任何数据源视为可信任。是的,这意味着您的数据库不受信任。
答案 1 :(得分:0)
消除XSS风险的最佳解决方案始终是解决源代码中的问题。为此,您必须在处理和/或渲染回浏览器之前清理任何用户输入。例如,在JSP中使用JSTL <c:out>
标记或fn:escapeXml()
EL函数显示用户控制的输入时。
如果您无法执行第一个解决方案,因为它的成本很高,您应该执行常规服务器输入验证。
如果你使用的是Spring MVC,Struts,Struts2,Grails或JSF,你可以尝试HDIV。它消除了对于只读数据的XSS风险,对来自客户端的其余数据应用完整性验证(确保接收的值与服务器端生成的值相同)。对于表单中包含的文本字段(非只读数据),HDIV提供通用验证(白名单和黑名单)。此外,它还提供了更多功能,以消除或减轻OWASP十大风险。