我们在 subversion 中有一个使用 Capistrano 部署的 Rails 应用程序,但注意到我们可以访问“/.svn”中的文件,这带来了安全问题。

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

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

我真的不喜欢删除文件夹或使用 svn 导出的想法,因为我想保留“svn 信息”。

有帮助吗?

解决方案

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

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

如果你这样做,你可以使用类似的东西

<DirectoryMatch .*\.svn/.*>
    Deny From All
</DirectoryMatch>

如果不这样做,您可以使用 FilesMatch 在 .htaccess 文件中执行类似的操作

其他提示

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

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

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

我不喜欢对每个文件以点开头进行 404 处理的想法。我会使用更具选择性的方法,或者使用我在项目中使用的 cvs(示例中的 svn)

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

或一个包罗万象的简历系统

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

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

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

正确的规则是

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

我认为里卡多·加利说得对。即使 apache 已经禁止我使用 .svn 设置,但 .svn/entries 肯定是可用的...暴露了我的 svn 服务器、端口号、用户名等。

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

然后我想,为什么不限制所有应该隐藏的东西呢?任何人都可以想到这个问题吗?

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

我在初始句号后添加了“.*”——与 Riccardo 的唯一区别。似乎是 404 .svn、.git、.blah 等。

我宁愿拒绝访问所有点文件(例如:.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 ".*\/\..*"

这:

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

如果您不想将错误发送回用户,也可以使用。

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

RedirectMatch 将响应 404,这很棒。

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

用户将无法进入该目录——这就是“404 Not Found”出现的原因。但是,他们将能够查看该目录并为潜在的攻击者提供线索。

在我看来,Apache conf 应该是:

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

我不太喜欢 RedirectMatch,所以我使用了 RewriteRule 来代替:

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

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

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

所以我拿出了一个,效果很好。我不明白你为什么要在那里使用两个。有人愿意启发我吗?

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

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

代替

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

或者

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

像这样的东西是必要的

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

真正阻止一切,因为

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

我希望这有帮助。

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

(1)

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

(2)

RedirectMatch 404 /\.git

将这两个方法放入 .htaccess 文件。

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

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

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

/svn

/svn/rights/svnauth.conf

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

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

Foo.com 的访问权限

[foo.com:/trunk/source]

dev1=读写

dev2 = rw .....

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

有关更多信息,请仔细阅读 svn 红皮书。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top