我正在主要在 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 个主要更改。

  • 实现 Anitsamy 过滤器

    添加新过滤器并覆盖请求方法 getParameter 、 getParameterValues 以去除请求中的任何可疑标签。过滤器加载一个策略文件,我们在其中定义我们的规则,例如

    一种。需要从请求中删除的标签(标签等)

    湾常用属性的正则表达式,如 href、align 等。

  • 过滤器的实现示例在这里 http://barrypitman.com/2011/04/14/using-input-validation-XSS/
  • 使用 ESAPI 库执行输入验证
     String reportName = request.getParameter("reportName");
     ESAPI.validator().getValidInput("Report Name",
                                      reportName, "ReportNamePattern", 100, false);
    

    在上面的代码中,
  • "Report Name"是上下文
  • reportName 是数据字段
  • ReportNamePattern 是 ESAPI.properties 中定义的正则表达式模式 Validator.ReportNamePattern =^[a-zA-Z]{1}[0-9]{6}$
  • 100 是数据字段的最大长度 reportName
  • 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/

    10-10 02:41