我API Gateway Pattern
在一个Micro services
架构中Front End Angular app
使用HTTP request
我的API Gateway
项目,这只是一个ASP.net Core 3.1 Web API
项目。目前我只有 2micro services
和一个API Gateway
,它们都是ASP.net Core 3.1 Web API
项目类型。该API Gateway
项目具有我的所有控制器micro services
。的目的API Gateway
只是接收来自适当的请求Front end
并发出请求。HTTP Request
Micro service
现在在AccountController.cs
我的API Gateway
项目中,我有以下代码
/// <summary>
/// Gets the detail of an account by its id
/// </summary>
/// <param name="organizationId">Id of the Organization of which the account belongs to</param>
/// <param name="accountId">Id of Account of which information is being requested</param>
/// <returns>Account's Details</returns>
[HttpGet("{organizationId}/{accountId}")]
public async Task<IActionResult> GetAccountAsync(Guid organizationId, Guid accountId)
{
_uri = new Uri(uriString: $"{_configurationService.AccountAPI}GetAccount/{organizationId}/{accountId}");
using var result = await _client.GetAsync(_uri);
var content = await result.Content.ReadAsStringAsync();
return Ok(content.AsObject<MessageResponse<AccountDetailVM>>());
}
在 stackoverflow 上搜索问题后,我在Veracode 社区SSRF
找到了以下建议。
Veracode Static Analysis 将报告 CWE 918 的缺陷,如果它可以检测到来自应用程序外部的数据(例如来自用户的 HTTP 请求,也可能是用户上传的文件、数据库数据、Web 服务数据等) ) 能够改变网络请求的性质。
在Stackoverflow我发现了以下修复
对于 CWE ID 918,除非您有静态 URL,否则很难让 Veracode 识别您的修复程序。您需要验证成为请求 URL 一部分的所有输入。
这意味着我必须清理我的输入参数OrganizationId
,AccountId
然后再将它们附加到请求 URL。
还建议了有关veracode 社区的另一个问题
Veracode 静态分析会自动检测到作为此缺陷类别的补救措施的唯一一件事是将输入更改为硬编码
他们提出了查询字符串的解决方案
给定的示例似乎采用模型标识符并将其放在内部请求中使用的 URL 中。我们建议根据您对此数据类型的规则验证 ID(通常应该是字母数字且少于 255 个字符)并在将其附加到 URL 之前对其进行 URL 编码。
在所有这些东西之后,我对我的代码进行了以下更改
- 确保 OrganizationId 和 AccountId Guid 不为空
- URL 编码字符串
这是更改后的代码
/// <summary>
/// Gets the detail of an account by its id
/// </summary>
/// <param name="organizationId">Id of the Organization of which the account belongs to</param>
/// <param name="accountId">Id of Account of which information is being requested</param>
/// <returns>Account's Details</returns>
[HttpGet("{organizationId}/{accountId}")]
public async Task<IActionResult> GetAccountAsync(Guid organizationId, Guid accountId)
{
if (organizationId != Guid.Empty && accountId != Guid.Empty)
{
string url = HttpUtility.UrlEncode($"{_configurationService.AccountAPI}GetAccount/{organizationId}/{accountId}");
using var result = await _client.GetAsync(url);
var content = await result.Content.ReadAsStringAsync();
return Ok(content.AsObject<MessageResponse<AccountDetailVM>>());
}
return BadRequest();
}
这就是我可以做的所有事情来清理我的输入参数OrganizationId
,AccountId
但是在所有这些更改之后veracode
仍然可以在线识别SSRF
缺陷
使用 var result = await _client.GetAsync(url);