如何隐藏.git项目目录?

61

现在我已经设置好了nginx,需要隐藏我的.git目录。我需要什么样的rewrite规则来防止窥探?它应该放在server {}还是http {}块中呢?


1
答案在答案中,但如果您想确保自己做得正确(或者想了解更多有关漏洞的信息),请查看GitTools - August Janse
4个回答

77
http {
  server {
    location ~ /\.git {
      deny all;
    }
  }
}

这个location指令将拒绝访问任何子目录中的.git目录。

注意:location块必须位于主要location块之前,以便它可以首先被评估。


如果.git文件夹在子目录中,例如/folder/.git/,这个代码还能正常工作吗? - Xeoncross
3
可以的。"location ~"匹配正则表达式,而不是子路径。 - rzab
请注意,此位置块必须是第一个位置块。否则,其他块可能会先于它执行。在大多数情况下,只处理一个位置块。 - dreamlab
6
如果你有多个虚拟服务器,你是否可以只在所有其他服务器之前添加此配置块一次,还是必须在每个服务器中都复制? - Drew Noakes

58

隐藏目录和文件永远不应该在Web上被访问。对于你的问题,一般的答案是:

  location ~ /\.  { return 403; }

这将禁止访问任何子目录中的.git、.svn、.htaccess以及类似的文件。


虽然不完全符合问题的要求,但他说得对 :) - lorem monkey
34
我会更进一步地说,不应该有任何人知道它们的存在,这是绝对的!(不仅仅是他们应该被拒绝访问)。因此,你需要把回答从return 403;改成return 404;... 这样,试图访问它的人就不会知道它是否真的存在。 - Swivel
5
推荐使用"拒绝所有"(deny all)而非"返回403"(return 403)。参考链接:https://github.com/h5bp/server-configs/issues/126。 - Josiah
9
同意“保护所有隐藏目录”是一个明智的默认设置,但需要注意.well-known / RFC5785是一个隐藏目录/别名资源,在点位置应该是可访问的。 - Chris Burgess
location ~ /\..* { return 404; }会禁止访问以点(.)开头的所有目录(包括子目录)中的文件。 - Maxim Mandrik

12

使用其他解决方案时,我可以下载/.git/config和其他文件,只有/.git被保护。这个解决方案会阻止以点“.”开头的所有内容,无论请求的URL深度如何:

location ~ /\.(.*)/?(.*)? {
    return 404;
}

1
location ~ /\..* { return 404; } 表示拒绝访问以点号开头的所有目录和文件(包括子目录和文件)。 - Maxim Mandrik

1

3
我刚刚测试了一下, location ~ /\. { access_log off; log_not_found off; deny all; } 会阻止访问隐藏的子目录。因此,我认为额外的 .* 不是必要的。 - chrishiestand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接