【问题标题】:How to use ESAPI to fix Resource Injection (URL) issues如何使用 ESAPI 修复资源注入 (URL) 问题
【发布时间】:2016-02-10 20:53:26
【问题描述】:

我是 Stack Overflow 论坛的新手。我有一个关于修复强化扫描问题的问题。

HP Fortify 扫描报告以下代码的资源注入问题。

String testUrl = "http://google.com";
URL url = null;

try {
   url = new URL(testUrl);
} catch (MalformedURLException mue) {
   log.error("MalformedUrlException URL " + testUrl + " Exception : " + mue);
}

在上面的代码中 fortify 显示资源注入行 => url = new URL(testUrl);

我已使用 ESAPI 对 URL 验证进行了以下代码更改以解决此问题,

String testUrl = "http://google.com";
URL url = null;

try {
   String canonURL = ESAPI.encoder().canonicalize(strurl, false, false);
   if(ESAPI.validator().isValidInput("URLContext", canonURL, "URL", canonURL.length(), false)) {
       url = new URL(canonURL);
   } else {
       log.error("In Valid script URL passed"+ canonURL);
   }
} catch (MalformedURLException mue) {
   log.error("MalformedUrlException URL " + canonURL + " Exception : " + mue);
}

但是,Fortify 扫描仍报告为 en 错误。它没有解决这个问题。有什么做错了吗?

任何解决方案都会有很大帮助。

谢谢,

Marimuthu.M

【问题讨论】:

    标签: java esapi


    【解决方案1】:

    我认为这里真正的问题不是 URL 可能格式不正确,而是 URL 可能没有引用有效的站点。更具体地说,如果我,这个坏人,能够让你的 URL 指向我的网站,那么你从我的位置获取未经测试的数据,我可以返回可能用于破坏你的系统的数据。我可能会用它来表示返回“bob the bad guy”的记录,让 bob 看起来像个好人。

    我怀疑在您的代码中您没有在字符串中设置硬编码值,因为这通常用诸如

    之类的词来描述

    当应用程序允许用户输入来定义资源时,例如 文件名或端口号,可以操纵此数据执行或 访问不同的资源。

    (见https://www.owasp.org/index.php/Resource_Injection

    我认为正确的反应将是以下几种组合:

    1. 不要从用户那里获取结果,而是使用输入从您自己的内部列表中进行选择。

    2. 认为该值来自受信任的来源。例如,从严格控制的数据库或配置文件中读取。

    您不需要删除警告,您需要证明您了解风险并说明为什么可以在您的案例中使用该值。

    【讨论】:

      【解决方案2】:
      boolean isValidInput(java.lang.String context,
                       java.lang.String input,
                       java.lang.String type,
                       int maxLength,
                       boolean allowNull)
                       throws IntrusionException
      

      isValidInput 函数中的 type 定义了一个正则表达式或模式来匹配你的 testUrl。

      喜欢:

      try {
          ESAPI.validator().getValidInput("URI_VALIDATION", requestUri, "URL", 80, false);        
      } catch (ValidationException e) {
          System.out.println("Validation exception");
          e.printStackTrace();
      } catch (IntrusionException e) {
          System.out.println("Inrusion exception");
          e.printStackTrace();
      }
      

      如果 requestUri 与 Validator.URL 下的 validation.properties 中定义的模式匹配并且其长度小于 80 则通过。

      Validator.URL=^(ht|f)tp(s?)\:\/\/0-9a-zA-Z(:(0-9))( \/?)([a-zA-Z0-9\-\.\?\,\:\'\/\\\+=&%\$#_])?$

      【讨论】:

        【解决方案3】:

        这是对 Andrew 的回答,但 Fortify 警告您的问题是用户对 URL 的控制。如果您的应用程序稍后决定与该网站建立连接,并且它是不受信任的,那么这就是一个问题。

        如果这是一个您更关心共享公共 URI 的应用程序,那么您将不得不接受风险,并确保用户接受过有关固有风险的适当培训,并确保您是否重新显示这些 URL,有人不会尝试嵌入恶意数据。

        【讨论】:

          猜你喜欢
          • 2021-02-06
          • 1970-01-01
          • 2012-05-19
          • 1970-01-01
          • 1970-01-01
          • 2010-10-27
          • 1970-01-01
          • 2019-09-26
          • 1970-01-01
          相关资源
          最近更新 更多