通过移除 DNS 预解析解决了主题获取超时错误

继续讨论来自 Recent updates seemed to stop rake task themes:update to use a proxy server 的内容:

由于该超时错误,我无法获取或更新任何主题组件,最后我解决了这个问题。从文件 \u003cDiscourse\u003e/lib/theme_store/git_importer.rb 中删除了以下以 - 开头的行:

  def clone_http!
    uri = redirected_uri

    raise_import_error! if %w[http https].exclude?(@uri.scheme)

-    addresses = FinalDestination::SSRFDetector.lookup_and_filter_ips(uri.host)

-    raise_import_error! if addresses.empty?

    env = { "GIT_TERMINAL_PROMPT" => "0" }

    args =
      clone_args(
        uri.to_s,
-        "http.followRedirects" => "false",
-        "http.curloptResolve" => "#{uri.host}:#{uri.port}:#{addresses.join(\",\")}",
      )

    begin
      Discourse::Utils.execute_command(env, *args, timeout: COMMAND_TIMEOUT_SECONDS)
    rescue RuntimeError
      raise_import_error!
    end
  end

这段代码处理 DNS 预解析,然后强制 git 使用从预解析中获得的 IP 地址,我不知道为什么它在我的服务器上总是失败,所以我删除了该逻辑。

事实上,我对它的存在有一个疑问,git 本身会进行 DNS 解析,我们为什么需要这个逻辑?这并不明确。

SSRF(如 FinalDestination::SSRFDetector 中所述)代表 服务器端请求伪造 (Server-Side Request Forgery)。它指的是一种机制,攻击者可以通过该机制欺骗您的服务器访问攻击者原本无法访问的资源。

例如,想象您在私有网络中运行 Discourse,并通过反向代理允许从互联网访问。攻击者可以创建一个包含指向您私有网络内部 IP 地址的链接的主题。Discourse 的 Onebox 系统可能会检索该 URL 并在 Onebox 中显示其内容。

为防止这种情况,Discourse 不会访问任何用户提供的 URL,除非首先检查它们不指向私有 IP 地址。

可以说,对于主题和主题组件使用的 git 仓库来说,这可能不太重要,因为这些是由管理员指定的,但 Discourse 在这里采取了谨慎的态度。