如何在Apache中隐藏目录,特别是源代码控制?

时间:2008-10-18 10:51:41

标签: svn apache

我想让我的网站保持版本控制(特别是Subversion)并在有稳定版本更新时使用svn co来更新它,但我担心这样做的安全性,因为所有.svn文件夹将是公共的,其中包括各种私人数据,其中至少是我网站的完整源代码!

我能做些什么来防止这种情况发生?

7 个答案:

答案 0 :(得分:38)

两件事:

  1. 不要使用IfModule来提供您需要的功能。它可以用于自动索引,因为它可能不存在并且对于该方案不是至关重要的。但是你依靠重写来保护你的内容。因此,最好删除IfModule指令,让apache告诉你何时没有重写你启用它(或者至少知道你不会被'保护'并有意识地评论这些行)

  2. 如果您可以访问主配置文件,则无需使用重写,更容易使用

    <DirectoryMatch \.svn>
       Order allow,deny
       Deny from all
    </DirectoryMatch>
    
  3. 将生成403 Forbidden(从HTTP合规性角度来看更好) 或者,如果您想通过默认路线获取安全性,请使用AliasMatch

        AliasMatch \.svn /non-existant-page
    

    如果您无权访问主配置文件,则希望在.htaccess中启用mod_rewrite。

答案 1 :(得分:8)

在同样的情况下,我使用了RedirectMatch,原因有两个。首先,这是我能找到的唯一方法,在.htaccess上允许在该服务器上使用相当严格的配置,我无法修改。另外我认为它最干净,因为它允许我告诉Apache是​​的,那里有一个文件,但只是假装它不是在服务时,所以返回404(而不是403会暴露网站浏览者不应该知道的东西) )。

我现在将以下内容视为.htaccess文件的标准部分:

## Completely hide some files and directories.
RedirectMatch 404 "(?:.*)/(?:[.#].*)$"
RedirectMatch 404 "(?:.*)~$"
RedirectMatch 404 "(?:.*)/(?:CVS|RCS|_darcs)(?:/.*)?$"

答案 2 :(得分:7)

如果您的服务器对其中允许的内容稍微允许,则可以在单个虚拟主机的基础上,甚至在.htaccess文件内实现服务器范围(推荐)。您需要的具体配置是:

RewriteEngine On
RewriteRule /\.svn /some-non-existant-404-causing-page

<IfModule autoindex_module>
    IndexIgnore .svn
</IfModule>

第一部分需要mod_rewrite。它强制任何带有“/.svn”的请求(即对目录的任何请求,或目录中的任何内容)内部重定向到您网站上的不存在的页面。这对最终用户完全透明且不可检测。它还会强制出现404错误,就像您的.svn文件夹刚刚消失一样。

第二部分纯粹是装饰性的,如果激活了自动索引模块,它将隐藏.svn个文件夹。这也是一个好主意,只是为了让好奇的灵魂得到任何想法。

答案 3 :(得分:5)

我使用以下命令向用户返回一个简单的404,而不是显示源控件目录实际存在:

RedirectMatch 404 / \。(svn | git)(/ | $)

答案 4 :(得分:4)

我使用了一种有趣的方法:checkout(和更新)在一个完全独立的目录上完成(可能在一个完全独立的机器上),然后将代码复制到webserver将使用rsync读取的位置。 rsync命令行上的--exclude规则用于使其不复制任何.svn(和CVS)指令,而--delete-excluded确保它们将被删除,即使它们之前被复制过。

由于svn update和rsync都进行增量传输,因此即使对于较大的站点也是如此。它还允许您将您的存储库置于防火墙之后。唯一需要注意的是,您必须将服务器上生成的文件(例如Drupal上的files /目录)移动到rsync目标目录之外的所有目录(rsync将以这种方式覆盖所有内容),并且符号链接到它必须在rsync源目录中创建。 rsync源目录也可以包含其他非版本化文件(如机器特定的配置文件)。

我使用的全套rsync参数是

rsync -vv --rsh='ssh -l username' -rltzpy --exclude .svn/ --exclude CVS/ --exclude Attic/ --delete-after --delete-excluded --chmod=og-w,Fa-x

即便如此,为了实现冗余,我仍然有一个配置规则来阻止.svn被访问,从Debian默认规则复制,该规则阻止.ht *(。htaccess,.htpasswd)被接收。

答案 5 :(得分:3)

如Vinko所说,隐藏目录应该可行。但是使用svn export代替svn co可能更简单。这不应该生成.svn目录。

答案 6 :(得分:3)

考虑使用操作系统的软件包管理工具部署实时代码,而不是直接从VCS部署。这将使您确保您的实时包不包含元数据目录或其他可能敏感的工具和数据。