我正在尝试调用网络服务。此网络服务调用取决于用户输入的URL。
URL如下所示:
https://someurl.com/somefunction/{userinput}
我的函数看起来像这样
public async Task<Data> GetData(string input)
{
try
{
Address = BaseAddress; // https://someurl.com/somefunction/{userinput}
Address = Address.Replace("{userinput}", input);
....
WebService ws = await base.GetData(httpClient, serverIPaddress);
....
}
}
我从Fortify得到了安全错误
服务器端请求伪造(输入验证和表示,数据 流)
第122行上的函数GetAsync()启动与之的网络连接 使用用户控制的数据获取资源URI的第三方系统。一个 攻击者可能利用此漏洞来代表发送请求 应用程序服务器的请求,因为请求将来自 应用程序服务器的内部IP地址。
以下是建议:
建议:
请勿基于用户控制的数据建立网络连接,并且 确保将请求发送到预期的目的地。如果 用户数据是构建目标URI所必需的,请使用 间接:创建用户所在的合法资源名称的列表 允许指定,并且仅允许用户从列表中选择。 通过这种方法,永远不会使用用户提供的输入 直接指定资源名称。
在某些情况下,此方法不切实际,因为 合法的资源名称太大或太难追踪。 在这种情况下,程序员经常将其列入黑名单。 将黑名单选择性地拒绝或逃避潜在的危险 使用输入之前的字符。但是,任何此类不安全列表 字符可能不完整,几乎可以肯定会成为 过时了。更好的方法是创建字符白名单 允许出现在资源名称中并接受输入 完全由批准集中的字符组成。
此外,如果需要,请确保用户输入仅用于 指定目标系统上的资源,但URI方案,主机, 端口由应用程序控制。这样一来, 攻击者能够做的将大大减少。
但是事实是,我确实需要根据用户提供的数据来更改{userinput}
。 {userinput}
将是具有一定最大长度的字符串。
如何解决此问题?
答案 0 :(得分:0)
经过大量研究和尝试,我终于通过将输入内容附加到BaseAddress
示例代码如下
public async Task<Data> GetData(string input)
{
try
{
var httpClient = new HttpClient();
httpClient.BaseAddress = new Uri($"https://someurl.com/somefunction/{input}");
var content = await httpClient.GetStringAsync("");
return JsonConvert.DeserializeObject<Data>(content);
}
}