0

我是 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 在 line => 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 错误。它没有解决这个问题。有什么做错了吗?

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

谢谢,

马里穆图

4

3 回答 3

2

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

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

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

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

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

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

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

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

于 2014-05-23T19:07:19.537 回答
0
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 \-\.\?\,\:\'\/\\\+=&%\$#_] )?$

于 2015-05-29T04:56:54.977 回答
0

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

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

于 2016-02-10T12:53:26.537 回答