服务器端请求伪造强化修复

时间:2019-07-23 06:40:12

标签: c# web-services fortify

我正在尝试调用网络服务。此网络服务调用取决于用户输入的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}将是具有一定最大长度的字符串。 如何解决此问题?

1 个答案:

答案 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);
    }
}