【发布时间】:2019-12-01 03:22:45
【问题描述】:
我正在尝试调用网络服务。此 Web 服务调用取决于用户输入的 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} 将是一个具有特定最大长度的字符串。
如何解决这个问题?
【问题讨论】:
-
你能解决这个问题吗?
-
@HamzaKhanzada,最后我根据数据库验证输入,并提供从数据库返回的值以分配给用户输入。
-
我发现另一个黑客可以在不通过数据库的情况下解决此问题。让我把它作为答案发布
标签: c# web-services fortify