使.git目录Web不可访问


Answers:


39

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

Order allow,deny
Deny from all

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


38
是的,但是我建议不要将其放在.git/目录本身中,因为如果您重新克隆存储库,它将丢失。
杰克·沃顿

如果您有多个.git目录,这很麻烦;如果您重新克隆该目录,则必须重新执行。
Bennett McElwee

1
我尝试过并发现它可以工作,但似乎任何解决方案都可以将此设置放在.git /中,它具有上面提到的2个缺点,第一个似乎最糟糕,再加上第三个可能最糟糕:quote(Make .git directory web无法访问),包括如何在何时及由谁完成的操作虽然很小,但仍是数据的关键(特别是出于安全性考虑,包括在未正确完成时和之前进行分析的原因)。.git /中的信息实际上并不是真正的一部分(包括版本化,共享和保存完好的),因此也无法还原...类似于一个最好的.gitignore数据,而不是.git /。
Destiny Architect

3
为什么这是公认的答案,而不是贝内特的答案?他是解决此问题的简单有效的技术。
乔什·弗兰克尔

1
最有可能是因为OP在另一年发布之前的两年接受了此;)
ThiefMaster

378

将其放在Web服务器根目录下的.htaccess文件中:

RedirectMatch 404 /\.git

该解决方案既强大安全:它

  • 适用.git于您网站中的所有目录,即使目录不止一个,
  • 还隐藏其他Git文件,例如.gitignore.gitmodules
  • 甚至适用于新添加的.git目录,并且
  • 甚至都没有放弃目录存在的事实。

1
它可以在.git文件夹上工作,但是我仍然可以.gitignore拉出文件。
Kurt Emch

我的正则表达式可以在我的测试中工作,并且应该根据RedirectMatch文档工作,因为该正则表达式只必须匹配部分URL,而不是完整URL:请参阅链接的AliasMatch文档中的“细微差别”注释。不过,文档是一回事,现实世界是另一回事。@artlogic正则表达式确实匹配完整的URL,因此Apache中可能存在一些版本差异,或者我只是在误读内容。
Bennett McElwee,2015年

2
@BennettMcElwee-在仔细阅读了文档并进行了一些测试之后,看来通配符对我而言根本不是必需的。感谢您的解决方案。很棒!
artlogic

根据apache2的文档,您还可以将其放入其他配置上下文中:server config, virtual host, directory, .htaccess
bennos

我什至建议在表达式的末尾添加“。*”,以便无法访问.git /下的文件/文件夹->RedirectMatch 404 /\.git.*
Dimitri Hautot

33

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

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

还有另一种与apache有关的方法,由于服务器设置,我不允许使用<Directory>指令。
克里斯·穆恩奇

2
有各种各样的匹配方式(例如<Files><FilesMatch>)。
杰克·沃顿

4
这个答案完全不正确-.htaccess文件中根本不允许使用目录。它不依赖于服务器设置。
2013年

2
NI8VDY =我尝试过1次失败:在Dreamhost共享主机上,我将其放在网站根目录的.htaccess中,然后将http:放到网站根目录中,从而给服务器日志提供了错误引用(.. <此处不允许使用目录)。2位评论者已经警告过此问题,并最后说了报价(.htaccess文件中根本不允许使用目录),请参阅官方目录文档httpd.apache.org/docs/current/mod/core.html#directory说报价(上下文:服务器配置,虚拟主机),而不是.htaccess。但这票数为26,所以那些发现如何使用.htaccess进行投票的人,PLS更新了解决方案的解释。
Destiny Architect

同意@DestinyArchitect-非常抱歉,这是误导。
kael


5

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

以下是一些详细说明,希望对您有所帮助。我正在使用Ubuntu 16.10。

  1. 首先检查如果在浏览器中导航到.git文件夹会发生什么。在我的情况下,向我显示了目录列表。如果您看到了不应该看到的内容(即未收到404),请执行以下操作。
  2. 使用apache2ctl -V获取HTTPD_ROOT和SERVER_CONFIG_FILE
  3. 用这个来编辑你的apache配置,在我的例子中是$ sudo nano /etc/apache2/apache2.conf
  4. 在配置文件中的以下位置添加以下内容:RedirectMatch 404 /.git
  5. 重启apache:$ sudo service apache2 restart
  6. 如果您再次导航到该文件夹​​,现在应该会得到404
  7. 我用.gitignore尝试了一下,还得到了404

4

一个更健壮和简单的选项将是禁用目录的“读取”和“执行”权限.git

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

该命令可以是:

chmod -R o-rx .git

在SA不希望使用.htaccess且不希望我弄乱其httpd.conf -type文件的计算机上,这似乎是最好的解决方案。
外星生命表格

1
明显的缺点是,如果您重新克隆,则必须记住要chmod再次运行。
劳里·努尔米

3

mod_rewrite将给您所需的效果:

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

9
这是一个信息泄露漏洞:它使人们更容易确定.git目录的存在,因为它返回禁止代码而不是未找到。
Bennett McElwee

2
这不是一个vulnerabity来使用git
亚当

1

.htaccess为什么不简单地将.git/目录放在webroot上方,而不是像大多数答案所建议的那样弄乱规则?

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

/home/web/project_name/.git/

我的实际代码位于

/home/web/project_name/www_root/

因为我的网站根(在Apache或Nginx的定义。我更喜欢后者)是/home/web/project_name/www_root/没有办法的.git目录可以通过Web访问,因为它生活“高于”的根目录


所以public_html是仓库工作目录的子目录?听起来很有趣
海登思林

不,它不是子目录。他们都是我主项目目录中的“兄弟姐妹”。我的project_name目录有两个子目录:www_root访问者浏览我的网站时实际在其中提供文件的位置以及存储库.git所在的位置。从存储库中提取更新www_root及其内容。事实是,由于该.git目录位于我的前端控制器的上方,因此无法通过Web访问。
哈维尔·拉鲁莱

我认为这是我的意思,因此您拥有/ home / user / public_html /和/home/user/.git
Hayden Thring,

哇,这是个天才的简单易用的解决方案(不是很难在apache security.conf中建立服务器级的块),唯一需要注意的是,如果您的主机在publlic_html上有一些奇怪的所有权/权限设置,可能会改变。
Hayden Thring

1
非常正确...实际上,我还有其他“兄弟目录”出于其他目的,这些其他目录仍然无法从Web上访问,这使我晚上睡得更好:)
哈维尔·拉鲁莱
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.