在我的项目中,资源注入问题是在创建新的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();
答案 0 :(得分:0)
我立即看到这一行:
String resource = "https://someWebsite.com/api"+username;
我知道我们有麻烦了。
为什么?我建议您发表评论,因为您需要问自己“我在这里做什么?”
您的最初反应可能是:“我将用户名连接到URI字符串。这是基于REST的Web服务,所以有什么大不了的?”
这是因为您没有按照重要性顺序进行标记:
avgvstvs在这里做了什么?为什么在明确输入时他会说输出?
作为程序员,您有责任,他们从未在学校教过您。在应用程序上工作时,您必须了解所使用变量的数据流。您需要将所有输入分为两类:
您需要考虑那些意图使用系统的用户是邪恶的;这并不是要让您认为所有用户都是敌人-尽管这里的一些资深人士可能会反对-但在编写安全代码时,您需要考虑对手将如何滥用您的代码。 / p>
一旦您了解了外部环境,现在应该对您来说就更清楚了。
您网站的任何用户都可以点击“ f12”并调用工具,使他们可以轻松绕过可能存在的任何客户端保护:任何来自任何的输入用户应被视为潜在恶意软件。我上面所说的是防止滥用的主要防御措施:转义正确的上下文并验证输入。
在使用任何值之前,应先对其进行验证。就目前而言,我可以模拟使用该API网址注册的任何用户。几个输入检查在这里很有意义:
Web框架的构建和使用可能已经回答了其中一些问题,但是我建议您了解您的框架如何针对所有这些问题保护应用程序。凭经验,1、3和4几乎总是由应用程序的其他部分管理,但是直到您知道之前,请务必提出这些问题。
为什么要输出编码/转义?这不是输入吗?
当您决定将用户名连接到URI,然后继续进行请求时,请问自己:“我在这里实际上在做什么?”
显然,目的是获取用户名,并将其连接到将要使用的值 ...
每次 使用 变量时,您都需要再次问自己所有这些问题,再加上一个问题:
在这种情况下,您要将值传递到指示将在URI中使用的数据上下文。这意味着必须对数据进行正确的编码和转义,以便在URI中使用,这样我们才不会在堆栈下游引入错误和可能的进一步漏洞。
要解决此问题,请执行以下操作:
回答所有7个有关username变量的问题,然后从应用程序堆栈中选择适合您的方法。您确实标记了esapi,但是esapi不能为您解决所有这7个问题,仅提供输入验证和输出编码即可……您的应用程序的安全框架可能已经向您提供这些信息。