拒绝访问Apache上的.svn文件夹

时间:2008-12-29 16:12:05

标签: svn apache deployment capistrano

我们在subversion中有一个rails应用程序,我们使用Capistrano进行部署但注意到我们可以访问'/.svn'中的文件,这会引起安全问题。

我想知道最好的方法是什么。一些想法:

  • 拒绝访问的全局Apache配置
  • 在公共文件夹和所有子文件夹中添加.htaccess文件
  • 更改权限的上限任务

我真的不喜欢删除文件夹或使用svn export的想法,因为我想保留'svn info'。

13 个答案:

答案 0 :(得分:62)

最好的选择是使用Apache配置。

使用htaccess或全局配置主要取决于您是否控制服务器。

如果你这样做,你可以使用

之类的东西
<DirectoryMatch .*\.svn/.*>
    Deny From All
</DirectoryMatch>

如果不这样做,您可以使用FilesMatch

在.htaccess文件中执行类似操作

答案 1 :(得分:43)

保护.svn文件的另一种方法是在Apache配置中使用重定向:

RedirectMatch 404 /\\.svn(/|$)

因此,不是获得403禁止(并提供攻击者的线索),而是获得404,这是我们在随机输入路径时所期望的。

答案 2 :(得分:30)

我不喜欢以点为单位404化每个文件的想法。 我使用更具选择性的方法,或者使用我在项目中使用的cvs(示例中的svn)

RedirectMatch 404 /\\.svn(/|$)

或捕获所有cvs系统

RedirectMatch 404 /\\.(svn|git|hg|bzr|cvs)(/|$)

- 过时的答案如下(见评论) -

我还不能写评论...... csexton的答案不正确,因为用户无法访问.svn文件夹,但可以访问其中的任何文件! 例如你可以访问 http://myserver.com/.svn/entries

正确的规则是

RedirectMatch 404 /\\.svn(/.*|$)

答案 3 :(得分:14)

我认为Riccardo Galli做对了。即使apache已经设置为.svn设置为禁止我,但.svn / entries肯定可用...暴露我的svn服务器,端口号,用户名等。

我实际上认为,为什么不限制.git作为一种预防措施(比如说你还没有使用git,但有一天你可能不会考虑目录限制)。

然后我想,为什么不限制应该隐藏的一切?任何人都可以设想这个问题吗?

RedirectMatch 404 /\\..*(/.*|$)

我在初始阶段之后添加了'。*' - 仅与Riccardo有所不同。似乎是404 .svn,.git,.blah等。

答案 4 :(得分:6)

我宁愿拒绝访问所有点文件(例如:.htaccess,.svn,.xxx等),因为它们通常不需要通过网络访问。

以下是实现此目的的规则(包括Apache 2.2):

<LocationMatch "\/\..*">
    Order allow,deny
    Deny from all
</LocationMatch>

(更新)或者您可以使用以下内容(适用于Apache 2.2和2.4):

# Deny access to dot-files, as 404 error
# (not giving hint about potential existence to the file)
RedirectMatch 404 ".*\/\..*"

答案 5 :(得分:2)

此:

RedirectMatch permanent .*\.(svn|git|hg|bzr|cvs)/.* /
如果您不想将错误发送回用户,也可以使用

它只会重定向回网站根页面。此外,这是永久重定向,因此机器人不会尝试重新索引此网址。

答案 6 :(得分:1)

RedirectMatch将以404响应,这很棒。

但是,如果启用了“选项+索引”,则用户仍然可以从父目录中看到“.svn”目录。

用户将无法进入目录 - 这是“未找到404”的地方。但是,他们将能够看到目录并提供攻击者的线索。

答案 7 :(得分:1)

在我看来,Apache conf应该是:

<Directory ~ "\.svn">
    Order allow,deny
    Deny from all
</Directory>

答案 8 :(得分:1)

我不是那么喜欢RedirectMatch,所以我使用了RewriteRule:

RewriteRule /\..*(/.*|$) - [R=404,L]

连字符表示“不做任何替换”。我也无法弄清楚为什么,在上面的例子中,正则表达式有两个反斜杠:

/\\..*(/.*|$)

所以我拿了一个,它运行正常。我无法弄清楚为什么你会在那里使用两个。有人关心开导我吗?

答案 9 :(得分:1)

Apache Subversion常见问题解答正在消化这个解决方案:

# Disallow browsing of Subversion working copy administrative dirs.
<DirectoryMatch "^/.*/\.svn/">
    Order deny,allow
    Deny from all
</DirectoryMatch>

来源:https://subversion.apache.org/faq.html#website-auto-update

答案 10 :(得分:1)

与mod_alias中的其他指令一样,RedirectMatch也是区分大小写的,即使在不区分大小写的文件系统上也是如此(请参见mod_alias documentation)。因此,以上关于所有版本控制系统的匹配和阻止文件的答案都不正确。

代替

RedirectMatch 404 /\\.(svn|git|hg|bzr|cvs)(/|$)

RedirectMatch permanent .*\.(svn|git|hg|bzr|cvs)/.* /

像这样的事情是必需的

RedirectMatch 404 "(?i)/\.?(cvs|svn|git|hg|bzr)"

真正阻止一切,因为

  • CVS目录为大写;和
  • 不要以前面的点(。)开头。

我希望有帮助。

答案 11 :(得分:0)

在服务器配置文件的.htaccess中。

(1)

RewriteEngine on
RewriteRule "^(.*/)?\.git/" - [F,L]

和 (2)

RedirectMatch 404 /\.git

将这两种方法都放在.htaccess文件中。

它隐藏任何名称以.git开头的文件或目录,如.git目录或.gitignore文件,返回404.

答案 12 :(得分:-7)

在subversion服务器安装中创建访问权限文件。

例如,如果您的文件夹结构是

/ SVN

/svn/rights/svnauth.conf

创建配置文件并在apache subversion配置文件中输入该文件的路径,您通常可以在 /etc/httpd/conf.d/subversion.conf

中找到该文件。

在您的svnauth.conf文件中,将权限定义为:

Foo.com的访问权限

[foo.com:/trunk/source]

DEV1 = RW

DEV2 = RW .....

通过这种方式,您可以在一个单一级别的文件中控制访问权限。

有关详细信息,请参阅svn红皮书。