使 .git 目录 web 无法访问

Posted

技术标签:

【中文标题】使 .git 目录 web 无法访问【英文标题】:Make .git directory web inaccessible 【发布时间】:2011-09-02 19:13:57 【问题描述】:

我有一个网站,我使用 github(封闭源代码)来跟踪更改和更新网站。唯一的问题是,.git 目录似乎可以通过网络访问。我怎样才能停止这种情况并仍然能够使用 git?

我应该使用 .htaccess 吗? 我应该更改 .git 的权限吗?

【问题讨论】:

服务器故障:serverfault.com/questions/128069/… 【参考方案1】:

把它放在你的网络服务器.htaccess文件中:

RedirectMatch 404 /\.git

此解决方案稳健安全:它

适用于您网站中的所有 .git 目录,即使有多个目录, 还隐藏了其他 Git 文件,例如 .gitignore.gitmodules 甚至适用于新添加的.git 目录,并且 甚至没有透露目录存在的事实。

【讨论】:

它在 .git 文件夹上工作,但我仍然可以拉起 .gitignore 文件。 我的正则表达式在我的测试中工作,并且 应该 根据 RedirectMatch documentation 工作,因为正则表达式只需要匹配 URL 的一部分,而不是完整的 URL:请参阅链接AliasMatch documentation 中的“细微差别”注释。尽管如此,文档是一回事,现实世界是另一回事。 @artlogic 正则表达式确实匹配完整的 URL,所以可能 Apache 中存在一些版本差异,或者我只是误读了一些东西。 @BennettMcElwee - 在仔细查看文档并运行一些测试之后,看起来通配符对我来说毕竟不是必需的。感谢您的解决方案。效果很好! 根据apache2 docs你也可以把它放到其他配置上下文中:server config, virtual host, directory, .htaccess 我什至建议在表达式末尾添加“.*”,这样.git/下的文件/文件夹就无法访问--> RedirectMatch 404 /\.git.*【参考方案2】:

.git 文件夹中创建一个.htaccess 文件并将以下内容放入该文件中:

Order allow,deny
Deny from all

但请注意,如果您重新克隆存储库,它将会丢失

【讨论】:

是的,但我建议不要将它放在 .git/ 目录本身,因为如果您重新克隆存储库,它会丢失。 如果您有多个 .git 目录,这会很痛苦,如果您重新克隆该目录,则必须重新完成。 我试过这个并发现它有效,但是这个似乎任何将这个设置放在 .git/ 中的解决方案都有上面提到的两个缺点,第一个似乎最糟糕,加上第三个可能最糟糕的:报价(使 .git 目录 web 无法访问),包括它是如何在何时和由谁完成的,很小但仍然是数据的关键(尤其是为了它的安全性,包括在未正确完成时和之前的分析)但在 .git/ 它是不是真正的数据的一部分(包括版本化&共享&保存完好),所以也没有恢复......类似于一个最好的 .gitignore 与数据正确而不是在 .git/ 中。 为什么这是公认的答案,而不是 Bennett 的?他是解决这个问题的简单而有效的技术。 很可能是因为 OP 在另一个发布前两年就接受了这个;)【参考方案3】:

.htaccess.git/ 文件夹的权限都可以使用。我推荐前者:

<Directory .git>
    order allow,deny
    deny from all
</Directory>

【讨论】:

由于服务器设置的原因,我不允许使用 指令,因此还有其他方法可以处理 apache。 匹配方式有很多种(如&lt;Files&gt;&lt;FilesMatch&gt;)。 这个答案完全不正确 - .htaccess 文件中根本不允许目录。它不依赖于服务器设置。 NI8VDY=在我尝试过的 1 次中的 1 次中失败:在 Dreamhost 共享主机上,我把它放在网站的根目录中。 . httpd.apache.org/docs/current/mod/core.html#directory 说引用(上下文:服务器配置,虚拟主机),所以不是 .htaccess。但这有 26 票,所以那些发现如何从 .htaccess 中解决这个问题的人,请更新解决方案解释。 同意@DestinyArchitect -- 很抱歉投反对票,但这是误导。【参考方案4】:

我不想在.git 目录中闲逛,也无法让Bennett's solution 在Apache 2.2 上工作,但将以下内容添加到我的&lt;VirtualHost&gt; 配置中是可行的:

RewriteRule ^.*\.git.* - [R=404]

【讨论】:

【参考方案5】:

更强大和简单的选项是禁用.git 目录的读取和执行权限。

由于 Apache (httpd) 大多运行在一个特殊的用户帐户下,例如它在 CentOS 上以用户 apache 运行,而 .git 目录必须在真实用户帐户下创建,所以我们可以简单地阻止通过更改权限访问。而且,这种方式不会引入任何新文件,也不会影响 git 命令。

命令可以是:

chmod -R o-rx .git

【讨论】:

在 SA 不想使用 .htaccess 并且不想让我弄乱他们的 httpd.conf 类型文件的机器上,这似乎是最好的解决方案。 明显的缺点是如果你重新克隆,你将不得不记住再次运行chmod【参考方案6】:

我不习惯单独控制对我的 .git 文件夹的访问,而是选择通过 apache config 而不是 .htaccess 来完成,以防止我覆盖它们,或者忘记新安装等。

这里有一些详细的说明,希望对您有所帮助。我正在使用 Ubuntu 16.10。

    首先检查如果您在浏览器中导航到 .git 文件夹会发生什么。就我而言,我看到了一个目录列表。如果您看到了不应该看到的内容(即您没有收到 404),请执行以下操作。 使用 apache2ctl -V 获取 HTTPD_ROOT 和 SERVER_CONFIG_FILE 使用它来编辑您的 apache 配置,在我的例子中是 $ sudo nano /etc/apache2/apache2.conf 在配置文件的某处添加以下内容:RedirectMatch 404 /.git 重启 apache:$ sudo service apache2 restart 如果您再次导航到该文件夹​​,现在应该会收到 404 我用 .gitignore 试过这个,也得到了 404

【讨论】:

【参考方案7】:

mod_rewrite 会给你想要的效果:

RewriteEngine on
RewriteRule .*\.git/.* - [F]

【讨论】:

这是一个信息泄露漏洞:它使人们很容易确定.git目录的存在,因为它返回的是禁止代码而不是未找到。 使用git不是漏洞 @Adam 他的意思是这将重定向到主页而不是给出 404,因此黑客会知道存在他们无法访问的 GIT 目录。正确的解决方案是返回 404。【参考方案8】:

与其像大多数答案所暗示的那样乱用.htaccess 规则,为什么不简单地将.git/ 目录放在webroot 之上?

在我的设置中,我的.git 目录通常位于以下位置:

/home/web/project_name/.git/

我的实际代码位于

/home/web/project_name/www_root/

由于我的网络根目录(在 Apache 或 nginx 上定义。我更喜欢后者)是 /home/web/project_name/www_root/,因此无法从网络访问 .git 目录,因为它的位置“高于”网络根目录

【讨论】:

so public_html 是 repo 工作目录的子目录??听起来很有趣 不,它不是子目录。它们都是我的主项目目录中的“兄弟姐妹”。我的project_name 目录有两个子目录:www_root 是访问者浏览我的网站时实际提供的文件所在的位置,.git 是存储库所在的位置。从 repo 中提取更新 www_root 及其内容。问题是,由于.git 目录在层次上“高于”我的前端控制器,因此无法通过网络访问。 我想这就是我的意思,所以你有 /home/user/public_html/ 和 /home/user/.git 哇,这是一个如此简单的解决方案,它的天才,(并不是说在 apache security.conf 中创建服务器范围的块很难)唯一需要注意的是,如果您的主机有一些奇怪的东西publlic_html 上的所有权/权限设置,可能会更改。 非常正确......我实际上还有其他“兄弟目录”用于其他目的,这些目录仍然无法通过网络访问,这让我晚上睡得更好一点:)【参考方案9】:

apache2 (LAMP) 服务器的解决方案 - 您有 2 个地方可以添加 .htaccess 内容。如果 1 个失败,请尝试下一个

    用于(开发环境)

在 /var/www/html 根目录下创建 .htaccess 文件并将代码粘贴到其中

<Directorymatch "^/.*/\.git/">
  Order 'deny,allow'
  Deny from all
</Directorymatch>
    用于(生产环境)

在虚拟主机文件中(/etc/apache2/sites-enabled/)>找到你的虚拟主机文件>打开文件>关闭虚拟主机标签后,粘贴

<Directorymatch "^/.*/\.git/">
  Order 'deny,allow'
  Deny from all
</Directorymatch>

无需重启服务器,在页面被调用时运行

【讨论】:

以上是关于使 .git 目录 web 无法访问的主要内容,如果未能解决你的问题,请参考以下文章

微信公众号域名网页授权无法访问XXXXX指向的web服务器目录(或虚拟机),请检查网络设置

IDEA Springboot webapp下资源无法访问

在 Visual Studio 2015 git repo 中切换分支时发生错误,无法 rmdir 访问被拒绝

无法从Web应用程序访问Azure公共和私有证书

WEB-INF

关于WEB-INF目录下无法访问webapp下的css等静态文件