正在清理 url 和参数

Sanitizing url and parameters

目前,我的软件有以下工作流程

  1. 用户通过 REST API 执行搜索并选择一个项目
  2. 服务器再次执行相同的搜索以验证用户的选择

为了执行第 2 步,用户必须将他用于搜索的 URL 参数作为字符串发送(例如 age=10&gender=M)。

服务器将http_get(url + "?" + params_str_submitted_by_user)

恶意用户能否通过操纵 params_str_submitted_by_user 使服务器连接到非预期的服务器?

如果甚至保留换行符并且用户可以任意操作 HTTP,最坏的情况是什么 headers?

由于您在 ? 定界符后将 params_str_submitted_by_user 附加到基础 URL 中,因此您可以免受此类攻击用户名或密码:

假设 URL 是 http://example.comparams_str_submitted_by_user@evil.com 而您的 /? 字符中没有=83=] 字符串连接.

这将使您的 URL http://example.com@evil.com 实际上意味着域 evil.com.

的用户名 example.com

但是,the username cannot contain the ? (nor slash) character,所以你应该是安全的,因为你强制连接用户名。在你的情况下 URL 变为:

http://example.com?@evil.com

http://example.com/?@evil.com

如果你在基础中包含斜杠 URL(更好地练习)。这些是安全的,因为它所做的只是将您的网站 evil.com 作为查询字符串值传递,因为 @evil.com 将不再被解析器解释为域。

What is the worst case scenario if even newlines are left in and the user can arbitrarily manipulate the HTTP headers?

这取决于您的 http_get 函数在清理值方面的表现。如果 http_get 不在内部去除换行符,攻击者可能会控制从您的应用程序发送的 headers。

例如如果http_get内部创建了以下请求

GET <url> HTTP/1.1
Host: <url.domain>

所以在合法使用下它会像下面这样工作:

http_get("https://example.com/foo/bar")

生成

GET /foo/bar HTTP/1.1
Host: example.com

攻击者可以将 params_str_submitted_by_user 设置为

<space>HTTP/1.1\r\nHost: example.org\r\nCookie: foo=bar\r\n\r\n

这会导致您的代码调用

http_get("https://example.com/" + "?" + "<space>HTTP/1.1\r\nHost: example.org\r\nCookie: foo=bar\r\n\r\n")

这将导致请求成为

GET / HTTP/1.1
Host: example.org
Cookie: foo=bar

 HTTP/1.1
Host: example.com

根据 http_get 解析域的方式,这可能不会导致请求转到 example.org 而不是 example.com - 它只是在操纵 header(除非example.org 是另一个站点 ,IP 地址 与您的站点相同)。然而,攻击者设法操纵了 headers 并添加了他们自己的 cookie 值。攻击者的优势取决于他们这样做在您的特定设置下可以获得什么 - 不一定有任何一般优势,如果他们可以欺骗您的代码以意想不到的方式运行,那将更像是一种逻辑缺陷利用导致它在攻击者的控制下发出请求。

你应该怎么做?

为了防止意外和未知情况,请使用能够正确处理 header 注入的 http_get 版本。许多现代语言现在在内部处理这种情况。

或者 - 如果 http_get 是您自己的实现,请确保它清理或拒绝包含无效字符的 URLs,例如回车 returns 或换行和其他无效参数在URL。 See this question for list of valid characters.