我进行了更改,将 esapi-2.1.0.-6ren">
gpt4 book ai didi

java - 用于 XSS 预防的 ESAPI 不起作用

转载 作者:搜寻专家 更新时间:2023-11-01 04:02:46 24 4
gpt4 key购买 nike

我主要在 JSPS 中修复代码中的跨站点脚本问题。

下面是原代码

 //scriplet code
<% String userId = request.getParameter("sid");
...%>

在同一个 Jsp 中他们有

     <input type = hidden name = "userID" value = "<%= userId %>" />

我进行了更改,将 esapi-2.1.0.jar 包含在 lib 中,并将 ESAPI.properties、validation.properties 包含在类路径中。然后对 scriplet 代码进行以下更改以修复上述代码

      //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 项主要更改。

  1. 实现 Anitsamy 过滤器

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

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

    href、align 等常见属性的正则表达式。

过滤器的实现示例在这里http://barrypitman.com/2011/04/14/using-input-validation-XSS/

  1. 使用 ESAPI 库执行输入验证

     String reportName = request.getParameter("reportName");
    ESAPI.validator().getValidInput("Report Name",
    reportName, "ReportNamePattern", 100, false);

    在上面的代码中,

    1. “报告名称”是上下文
    2. reportName为数据字段
    3. ReportNamePattern 是在 ESAPI.properties 中定义为 Validator.ReportNamePattern =^[a-zA-Z]{1}[0-9]{6}$
    4. 的正则表达式模式
    5. 100 是数据字段 reportName 的最大长度
    6. false 是一个标志,表示不允许空值。
  2. 执行输出编码
    正如@avgvstvs 所指出的,输出编码也是必须的。

    如果在HTML中使用reportName字段,下面是如何编码

    <tr> <th> Report :     <%=ESAPI.encoder().encodeForHTML(reportName)%> </th> </tr>

    如果要在javascript代码中使用reportName字段,下面是如何编码

     var reportName = "<%= ESAPI.encoder().encodeForJavaScript(reportName)%>";

    如果在HTML Attribute中使用reportName字段,下面是如何编码

    <input type=hidden name="USERNAME" value="<%=ESAPI.encoder().encodeForHTMLAttribute
    (reportName)%>"/>

关于java - 用于 XSS 预防的 ESAPI 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29393828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com