【问题标题】:Can I disable Mercurial cloning/pulling over HTTP?我可以禁用 Mercurial 克隆/通过 HTTP 拉取吗?
【发布时间】:2011-04-27 09:26:54
【问题描述】:

我们在生产服务器上使用 Mercurial 来处理一些较小的 Web 项目,以便通过 SSH 将更改推送到服务器来轻松部署应用程序。存储库位于其各自帐户的 public_html 文件夹中。

现在如果我做一个

hg clone http://www.domain.com

我明白了

real URL is http://www.domain.com/
requesting all changes
adding changesets
adding manifests
transaction abort!
rollback completed
abort: empty or missing revlog for .htaccess

幸运的是,如果没有身份验证,克隆似乎是不可能的,但我宁愿不让任何人知道一开始就有可用的 hg 存储库。

有没有人知道一种方法可以对公众完全隐藏 Mercurial 存储库,即使它位于网络服务器上的 public_html/htdocs 之类的公共场所?我找不到任何有关如何实现这一目标的信息。

ETA: 显然,我还没有足够的声望来投票给任何答案。但是非常感谢你们俩的有用回答。 :)

【问题讨论】:

  • 您可以使用浏览器访问domain.com/.hg 吗?如果您可以访问它,则仍然可以通过递归下载那里的所有文件来进行克隆。 .htaccess 错误似乎无关紧要,但会导致 hg 在首先创建克隆操作后失败(adding changesetsadding manifests 行表明 hg 已成功连接到存储库)
  • 我们有一个重写规则,将所有请求路由到 /index.php,因此无法访问实际的 .hg 目录,我猜这就是克隆失败的原因。但就目录权限而言,如果不是重写规则,它将是可以访问的。

标签: security http mercurial clone


【解决方案1】:

在 repo 的 .hg/hgrc 中添加:

[web]
allowpull = false

这将在他们获得任何数据之前,在流程的更早阶段将错误排除在外(如果他们想要在回滚之前获得大量数据,则目前他们正在获得大量数据)。请注意,allowpull 没有下划线,这与大多数其他多字可变设置不同。

这完全阻止了他们通过 mercurial 获取内容,但他们仍然可以使用 wget、curl 或网络浏览器手动选择 http://www.domain.com/.hg/

为避免这种情况,您可以在 Web 服务器级别阻止任何包含 /.hg/ 的 URL。在 Apache 中看起来像:

<Directory "/your/doc/root/.hg">
  Order deny,allow
  deny from all
</Directory>

【讨论】:

  • 这就像一个魅力,非常感谢!只需将您的说明复制并粘贴到相应的文件中即可。
【解决方案2】:

你可以

  • 使您的网络服务器无法访问 .hg 目录
  • 通过 .htacces 魔法使 .hg 不可见(假设您使用 apache httpd)
  • 将存储库放置在 public_html 之外并使用 hg archive 填充 public_html

【讨论】:

  • 听起来不错。 .hg 目录属于与网络服务器相同的用户(共享托管环境)的帐户用户,所以我不知道是否可以使其无法访问网络服务器,但我肯定会研究第二个和第三个选项。非常感谢!