如何使用ESAPI修复资源注入(URL)问题

时间:2013-10-16 09:18:12

标签: java esapi

我是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);
}

在上面的代码中强化了在行中显示资源注入=> 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扫描报告仍然是错误的。它不能解决这个问题。有什么事吗?

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

谢谢,

Marimuthu.M

3 个答案:

答案 0 :(得分:2)

我认为这里真正的问题不是URL可能以某种方式格式错误,而是URL可能不会引用有效的网站。更具体地说,如果我,坏人,能够使您的URL指向我的网站,那么您从我的位置获取未经测试的数据,我可以返回可能用于危害您的系统的数据。我可能会用它来说回报一个“鲍勃坏人”的记录,让鲍勃看起来像个好人。

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

之类的单词来描述
  

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

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

我认为正确的反应将是以下的一些组合:

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

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

  3. 您不需要删除警告,您需要证明您了解风险并指出在您的案例中使用该值的原因。

答案 1 :(得分:0)

boolean isValidInput(java.lang.String context,
                 java.lang.String input,
                 java.lang.String type,
                 int maxLength,
                 boolean allowNull)
                 throws IntrusionException
  isValidInput函数中的

类型字段定义了与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 \ - \ \ \,\:\'\ / \\\ + =安培;%\ $#_] )$

答案 2 :(得分:0)

这是安德鲁的回答,但问题是Fortify警告你用户是否控制了URL。如果您的应用程序稍后决定与该网站建立连接,并且该网站不受信任,则这是一个问题。

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