我正在主要在 JSPS 中修复我们代码中的跨站点脚本问题。
下面是原代码
//scriplet code
<% String userId = request.getParameter("sid");
...%>
并且在同一个 Jsp 中
<input type = hidden name = "userID" value = "<%= userId %>" />
我已经进行了更改以在 lib 中包含 esapi-2.1.0.jar 并在类路径中包含 ESAPI.properties、validation.properties。然后对脚本代码进行以下更改以修复上述代码
//scriplet code
<% String userId = ESAPI.encoder().encodeForHTML(request.getParameter("sid"));
...%>
我认为这可以解决问题,但是当我使用 Fortify 扫描我的代码时,这些行再次突出显示为存在 XSS 问题。如果你们对如何处理这件事有任何想法,请提供帮助。谢谢。
- - - - 更新
非常感谢@avgvstvs。这是非常有见地的。遵循指南,不确定我是否错过了某些东西。代码 -
String userSID=ESAPI.encoder().encodeForHTMLAttribute(request.getHeader("janus_sid")); session.setAttribute("username",userSID);<input type=hidden name="USERNAME" value="<%= userSID %>"
对于另一个变量调试,下面是用法
String debugFlag = ESAPI.encoder().encodeForJavaScript(request.getParameter("debug"));var debugFlag = "<%= debugFlag%>";if(debugFlag == "y"){
document.title= title + " (" + host + ")";
defaultAppTitle = title + " (" + host + ")";
}
最新的 Fortify 扫描仍将它们列为漏洞 :-(
最佳答案
谢谢你们的帮助。终于想出了防止XSS问题并通过Fortify静态代码分析的解决方案。我将 ESAPI 与 Anitsamy 库一起使用。以下是所需的 3 个主要更改。
添加新过滤器并覆盖请求方法 getParameter 、 getParameterValues 以去除请求中的任何可疑标签。过滤器加载一个策略文件,我们在其中定义我们的规则,例如
一种。需要从请求中删除的标签(标签等)
湾常用属性的正则表达式,如 href、align 等。
过滤器的实现示例在这里 http://barrypitman.com/2011/04/14/using-input-validation-XSS/
String reportName = request.getParameter("reportName");
ESAPI.validator().getValidInput("Report Name",
reportName, "ReportNamePattern", 100, false);
在上面的代码中,
正如@avgvstvs 所指出的,输出编码也是必须的。
如果要在 HTML 中使用 reportName 字段,下面是如何编码
<tr> <th> Report : <%=ESAPI.encoder().encodeForHTML(reportName)%> </th> </tr>
如果要在javascript代码中使用reportName字段,下面是如何编码
var reportName = "<%= ESAPI.encoder().encodeForJavaScript(reportName)%>";
如果要在 HTML 属性中使用 reportName 字段,下面是如何编码
<input type=hidden name="USERNAME" value="<%=ESAPI.encoder().encodeForHTMLAttribute
(reportName)%>"/>
关于java - 用于 XSS 预防的 ESAPI 不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29393828/