创建新的URL(资源)时出现资源注入问题;

时间:2020-10-23 05:46:01

标签: java spring security spring-security esapi

在我的项目中,资源注入问题是在创建新的URL(资源)时出现的(强制静态扫描)。 该如何解决?

String username = "james";
String resource = "https://someWebsite.com/api"+username;
URL url = new URL(resource); //here it is giving resource injection issue in fortify scan
System.setProperty("https.proxySet", "true");
System.setProperty("https.proxyHost", "11.09.11.111");
System.setProperty("https.proxyPort", "90");        
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();

1 个答案:

答案 0 :(得分:0)

我立即看到这一行:

String resource = "https://someWebsite.com/api"+username;

我知道我们有麻烦了。

为什么?我建议您发表评论,因为您需要问自己“我在这里做什么?”

您的最初反应可能是:“我将用户名连接到URI字符串。这是基于REST的Web服务,所以有什么大不了的?”

这是因为您没有按照重要性顺序进行标记:

  1. 在用户控制的参数上转义输出
  2. 在用户控制的参数上输入编码。

avgvstvs在这里做了什么?为什么在明确输入时他会说输出?

作为程序员,您有责任,他们从未在学校教过您。在应用程序上工作时,您必须了解所使用变量的数据流。您需要将所有输入分为两类:

  1. WE(服务器)控件
  2. 填充用户(敌人)控制权

您需要考虑那些意图使用系统的用户是邪恶的;这并不是要让您认为所有用户都是敌人-尽管这里的一些资深人士可能会反对-但在编写安全代码时,您需要考虑对手将如何滥用您的代码。 / p>

一旦您了解了外部环境,现在应该对您来说就更清楚了。

您网站的任何用户都可以点击“ f12”并调用工具,使他们可以轻松绕过可能存在的任何客户端保护:任何来自任何的输入用户应被视为潜在恶意软件。我上面所说的是防止滥用的主要防御措施:转义正确的上下文并验证输入。

在使用任何值之前,应先对其进行验证。就目前而言,我可以模拟使用该API网址注册的任何用户。几个输入检查在这里很有意义:

  1. 相关用户是否已通过身份验证?
  2. 相关用户实际上存在于系统中吗?
  3. 是否已授权用户使用此URI指示的资源?
  4. 用户是否有有效的会话?
  5. 我的编程平台正在使用哪种字节编码,输入是否与此一致?
  6. 我们是否防止用户尝试在字节级别以及稍后可能使用的插入级别上使用多种或混合编码?

Web框架的构建和使用可能已经回答了其中一些问题,但是我建议您了解您的框架如何针对所有这些问题保护应用程序。凭经验,1、3和4几乎总是由应用程序的其他部分管理,但是直到您知道之前,请务必提出这些问题。

为什么要输出编码/转义?这不是输入吗?

当您决定将用户名连接到URI,然后继续进行请求时,请问自己:“我在这里实际上在做什么?”

显然,目的是获取用户名,并将其连接到将要使用的值 ...

每次 使用 变量时,您都需要再次问自己所有这些问题,再加上一个问题:

  1. 验证后我该交给哪个解释器?

在这种情况下,您要将值传递到指示将在URI中使用的数据上下文。这意味着必须对数据进行正确的编码和转义,以便在URI中使用,这样我们才不会在堆栈下游引入错误和可能的进一步漏洞。

要解决此问题,请执行以下操作:

回答所有7个有关username变量的问题,然后从应用程序堆栈中选择适合您的方法。您确实标记了esapi,但是esapi不能为您解决所有这7个问题,仅提供输入验证和输出编码即可……您的应用程序的安全框架可能已经向您提供这些信息。