使 .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>
【讨论】:
由于服务器设置的原因,我不允许使用<Files>
、<FilesMatch>
)。
这个答案完全不正确 - .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 上工作,但将以下内容添加到我的<VirtualHost>
配置中是可行的:
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服务器目录(或虚拟机),请检查网络设置