【问题标题】:How to prevent cURL from connecting to localhost?如何防止 cURL 连接到 localhost?
【发布时间】:2019-06-08 12:18:10
【问题描述】:

我正在实现一个 PHP 服务,它允许书签应用程序获取 URL 的页面标题。服务器将下载 HTML 并提取页面标题,但这需要用户提供要获取的 URL。

从安全的角度来看,我认为用户可以攻击 localhost 以查看是否有任何未对外暴露的 HTTP 服务。

我已经尝试配置 cURL 应该使用哪个网络接口,但这需要配置 PHP 使用哪个接口。当我在像 Docker 这样的容器中运行此服务时,这可能会成为一个问题,这会使这变得更加困难。

是否有用于阻止连接到本地主机的 cURL 配置选项?

或者有没有办法告诉 cURL 只使用外部网络接口?

【问题讨论】:

  • 您不能确保用户提供的 URL 是“外部”的,即以 http(s)://www 开头。
  • 创建一个仅执行 cURL 请求并在其中执行您想要执行的任何 URL 过滤器的函数。
  • @jibsteroos 是的,这就是我要做的,但我在想如果你可以阻止来自本地主机的 cURL,那么它是更安全的逻辑。

标签: php security curl localhost


【解决方案1】:

检查this answer,尤其是这段代码

$info=parse_url($url);
$host=strtolower($info["host"]);
if ($host === "localhost" || ((false !== filter_var ( $host, FILTER_VALIDATE_IP )) && (false === filter_var ( $host, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE )))) {
    $errors [] = "localhost and LAN IP URLs are not allowed.";
}

(但正如参考答案中所解释的那样,您可能还应该注意黑客提供的非http url,例如file:///etc/passwd,这会使curl返回文件系统本地文件..)

【讨论】:

  • 这根本不是一种安全保护。 http:///localhost/secret 打破了parse_url,因此这个检查很容易被绕过。
  • @JammyDodger 你当然明白了! php 不接受该 url 作为 localhost url,这不起作用,只会产生错误:php -r 'var_dump(file_get_contents("http:///localhost/secret"));' - 但 curl(和 libcurl)确实接受它作为 localhost url,这有效:curl -v http:///localhost/secret
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
相关资源
最近更新 更多