拒绝访问 Apache 上的 .svn 文件夹
Posted
技术标签:
【中文标题】拒绝访问 Apache 上的 .svn 文件夹【英文标题】:Deny access to .svn folders on Apache 【发布时间】:2010-09-28 17:17:29 【问题描述】:我们有一个使用 Capistrano 部署的 subversion 中的 rails 应用程序,但我们注意到我们可以访问 '/.svn' 中的文件,这会带来安全问题。
我想知道最好的方法是什么。一些想法:
拒绝访问的全局 Apache 配置 在公用文件夹和所有子文件夹中添加 .htaccess 文件 更改权限的 Cap 任务我不太喜欢删除文件夹或使用 svn 导出的想法,因为我想保留“svn 信息”。
【问题讨论】:
顺便说一下,您不需要将.htaccess文件放在子文件夹中,规则自动适用于所有子目录。 【参考方案1】:最好的选择是使用 Apache 配置。
使用 htaccess 或全局配置主要取决于您是否控制服务器。
如果你这样做,你可以使用类似的东西
如果不这样做,您可以使用 FilesMatch 在 .htaccess 文件中执行类似的操作
【讨论】:
我无法让它与 .htaccess 和 FilesMatch 一起使用。我可以让它阻止对site.com/.svn 的请求,但如果我直接请求它们,我仍然可以访问文件。现在我正在使用下面建议的 RedirectMatch。另一个选项是 RewriteRule。 我将这种方法与 Riccardo Galli 的多个 cvs 系统列表结合使用,效果非常好:<DirectoryMatch .*\.(svn|git|hg|bzr|cvs)/.*> Deny From All </DirectoryMatch>
这也匹配所有子目录/文件。它仅显示***目录是否存在(否则它将返回 404)但 .svn/doesnotexist 返回 403。
并非所有服务器都配置为从 .htaccess 覆盖此 httpd.conf 设置。如果有效;你很幸运。
对于 Apache 2.4+:<DirectoryMatch "/\.svn"> Require all denied </DirectoryMatch>
【参考方案2】:
另一种保护 .svn 文件的方法是在 Apache 配置中使用重定向:
RedirectMatch 404 /\\.svn(/|$)
因此,您得到的不是 403 禁止(并为可能的攻击者提供线索),而是 404,这是我们在随机输入路径时所期望的。
【讨论】:
是的,虽然这不符合 HTTP :) 为什么这 不 HTTP 兼容?顺便说一句,它对我很有用,谢谢!【参考方案3】:我不喜欢每个文件以点开头的 404 的想法。 我会使用更具选择性的方法,或者使用我在项目中使用的 cvs(示例中为 svn)
RedirectMatch 404 /\\.svn(/|$)
或者一个捕获所有 cvs 系统
RedirectMatch 404 /\\.(svn|git|hg|bzr|cvs)(/|$)
-- 过时的答案如下(见 cmets)--
我还不会写 cmets 所以... csexton 的答案不正确,因为用户无法访问 .svn 文件夹,但可以访问其中的任何文件! 例如你可以访问 http://myserver.com/.svn/entries
正确的规则是
RedirectMatch 404 /\\.svn(/.*|$)
【讨论】:
.* 不是必须的,csexton 的答案就足够了。 csexton 的正则表达式匹配请求路径末尾的“/.svn”或请求路径中任何位置的“/.svn/”。所以它也适用于 /path/to/.svn/entries 的请求。 你试过了吗?我做到了,我可以使用 csexton 规则访问 .svn/entries 我在 Apache 2.2 上使用规则RedirectMatch 404 /\.svn(/|$)
并通过 /.svn/entries 获得 404
你是对的。我写了这个答案,因为当时的行为不同。如果 $ 丢失(这是有道理的),今天 Apache 似乎使用正则表达式作为部分。我会更新我的答案。谢谢
我怀疑是这样的,所以我提到了我的 Apache 版本号。当前的行为更有意义,没错。【参考方案4】:
我认为 Riccardo Galli 是对的。甚至 apache 已经有我禁止的 .svn 设置,但 .svn/entries 肯定是可用的...暴露我的 svn 服务器、端口号、用户名等。
我实际上想,为什么不限制 .git 作为预防措施(假设您还没有使用 git,但可能有一天您不会考虑目录限制)。
然后我想,为什么不限制所有应该隐藏的东西呢?谁能想到这个问题?
RedirectMatch 404 /\\..*(/.*|$)
我在初始句号之后添加了“.*” - 与 Riccardo 的唯一区别。似乎是 404 .svn、.git、.blah 等。
【讨论】:
这适用于 .hg (Mercurial)。它还保护嵌套的文件夹和文件。 因为您只需要检查 URL 路径是否包含正斜杠后跟点,这也应该有效:RedirectMatch 404 /\.
最干净的正式正确的正则表达式是:RedirectMatch 404 /\..*$
【参考方案5】:
我宁愿拒绝访问所有点文件(例如:.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 ".*\/\..*"
【讨论】:
@w00t 刚刚更改为在 2.4 上提出一个可行的解决方案,谢谢。【参考方案6】:RedirectMatch 会以 404 响应,这很好。
但是,如果启用“选项+索引”,那么用户仍然可以从父目录中看到“.svn”目录。
用户将无法进入该目录 - 这就是“404 Not Found”的来源。但是,他们将能够看到该目录并为可能的攻击者提供线索。
【讨论】:
【参考方案7】:在我看来,Apache conf 应该是:
<Directory ~ "\.svn">
Order allow,deny
Deny from all
</Directory>
【讨论】:
【参考方案8】:这个:
RedirectMatch permanent .*\.(svn|git|hg|bzr|cvs)/.* /
如果您不想将错误发送回用户,也可以使用。
它只是重定向回站点根页面。此外,这是一个永久重定向,因此机器人不会尝试重新索引此 URL。
【讨论】:
【参考方案9】:我不是很喜欢 RedirectMatch,所以我改用了 RewriteRule:
RewriteRule /\..*(/.*|$) - [R=404,L]
连字符的意思是“不要做任何替换”。我也不明白为什么在上面的例子中,正则表达式有两个反斜杠:
/\\..*(/.*|$)
所以我拿出了一个,它工作正常。我不明白为什么你会在那里使用两个。有人愿意开导我吗?
【讨论】:
谢谢。我发现它也可以更简单:RewriteRule /\. - [R=403,L]
适合我。【参考方案10】:
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
【讨论】:
【参考方案11】:RedirectMatch 与 mod_alias 中的其他指令一样,即使在不区分大小写的文件系统上也区分大小写(请参阅 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 目录是大写的;和 不要以点 (.) 开头。希望对你有帮助。
【讨论】:
【参考方案12】:在您的服务器配置文件的 .htaccess 中。
(1)
RewriteEngine on
RewriteRule "^(.*/)?\.git/" - [F,L]
并且 (2)
RedirectMatch 404 /\.git
将这两种方法都放在.htaccess
文件中。
它通过返回 404 隐藏任何名称以 .git 开头的文件或目录,例如 .git 目录或 .gitignore 文件。
【讨论】:
【参考方案13】:在您的 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 红皮书。
【讨论】:
你误解了这个问题。他在谈论结帐时创建的 .svn 目录,而不是关于存储库的开发人员权限以上是关于拒绝访问 Apache 上的 .svn 文件夹的主要内容,如果未能解决你的问题,请参考以下文章