jsp输入标记上的跨站点脚本问题
我对Acunetix和XSS的问题还不熟悉,所以我在这里有点迷茫 问题是,我有一份报告说,我的代码中可能存在易受跨站点脚本(XSS)攻击的漏洞jsp输入标记上的跨站点脚本问题,jsp,security,servlets,xss,Jsp,Security,Servlets,Xss,我对Acunetix和XSS的问题还不熟悉,所以我在这里有点迷茫 问题是,我有一份报告说,我的代码中可能存在易受跨站点脚本(XSS)攻击的漏洞 URL encoded POST input chkId_0 was set to 203_908434'():;998649 The input is reflected inside Javascript code between single quotes. 在我的JSP中,我有如下内容: <% if (!someCond
URL encoded POST input chkId_0 was set to 203_908434'():;998649
The input is reflected inside Javascript code between single quotes.
在我的JSP中,我有如下内容:
<% if (!someCondition) { %>
<input class="chkbox" type="checkbox" name="chkId_0" value="<%=office.getId()%>" <%=auxDisabled%> />
<% } else { %>
<input class="chkbox" type="checkbox" name="chkId_0" value=" <%=office.getId()%>" <%=auxDisabled%> disabled/>
<% } %>
我已经读到我可以使用JSTL(
)解决这个问题,但不幸的是,这不是我的选择,因为代码是遗留的
任何形式的帮助都将不胜感激。
提前谢谢
<input class="chkbox" type="checkbox" name="chkId_0" value="<%=office.getId()%>"/>
但是,看看错误:
输入反映在单引号之间的Javascript代码中
它不是在抱怨HTML注入,而是在抱怨JS注入。接收表单提交的页面上可能有类似的内容:
<script>
var chkId = '<%= request.getParameter("chkId_0") %>';
</script>
(这些示例使用了,在许多方面都不令人满意,但对于这些目的来说已经足够了。)
我正在使用一个过滤器并重写HttpServletRequestWrapper中的getParameter()和getParameterValues(),以避免一些其他XSS问题
这是完全行不通的。有几十种方法可以绕过你的黑名单模式。为了捕获所有可能的攻击,您必须禁止在HTML、JS或任何其他格式中使用的特殊字符,这些字符基本上阻止了所有标点符号,这是不可接受的
相反,请专注于在输出端使用正确的转义形式。如果您将ID打印到输入值中,我看不出XSS如何容易受到攻击,除非用户可以将任意字符串设置为ID。但不要尝试使用黑名单“剥离XSS”,否则您会遇到麻烦。黑客可能会想出一些你根本想不到的东西,如果你想这样做,最好尝试使用白名单。问题是,当我使用request.getQueryString()创建URL时,这个参数会进入URL的构造中。那么,在你看来,我应该怎么做而不是使用黑名单的方法呢。。?谢谢你的评论,你是说我没有用过滤器和黑名单模式来解决我的问题,但是正确的解决方案是什么?有什么建议吗?谢谢你的回答。
<input class="chkbox" type="checkbox" name="chkId_0" value="<%= StringEscapeUtils.escapeHtml4(office.getId()) %>"/>
<script>
var chkId = '<%= request.getParameter("chkId_0") %>';
</script>
<script>
var chkId = '<%= StringEscapeUtils.escapeEcmaScript(request.getParameter("chkId_0")) %>';
</script>