我们在 Subversion 中有一个使用 Capistrano 部署的 Rails 应用程序,但注意到我们可以访问“/.svn”中的文件,这会带来安全问题。
我想知道最好的方法是什么。一些想法:
- 拒绝访问的全局 Apache 配置
- 在公用文件夹和所有子文件夹中添加 .htaccess 文件
- 更改权限的上限任务
我不太喜欢删除文件夹或使用 svn 导出的想法,因为我想保留“svn 信息”。
我们在 Subversion 中有一个使用 Capistrano 部署的 Rails 应用程序,但注意到我们可以访问“/.svn”中的文件,这会带来安全问题。
我想知道最好的方法是什么。一些想法:
我不太喜欢删除文件夹或使用 svn 导出的想法,因为我想保留“svn 信息”。
最好的选择是使用 Apache 配置。
使用 htaccess 或全局配置主要取决于您是否控制服务器。
如果你这样做,你可以使用类似的东西
<DirectoryMatch .*\.svn/.*> 拒绝所有人 </目录匹配>
如果不这样做,您可以使用 FilesMatch 在 .htaccess 文件中执行类似的操作
保护 .svn 文件的另一种方法是在 Apache 配置中使用重定向:
RedirectMatch 404 /\\.svn(/|$)
因此,您得到的不是 403 禁止(并为可能的攻击者提供线索),而是 404,这是我们在随机输入路径时所期望的。
我不喜欢 404ing 每个文件以点开头的想法。我会使用更具选择性的方法,或者使用我在项目中使用的 cvs(示例中为 svn)
RedirectMatch 404 /\\.svn(/|$)
或捕获所有 cvs 系统
RedirectMatch 404 /\\.(svn|git|hg|bzr|cvs)(/|$)
-- 过时的答案如下(见评论) --
我还不能写评论所以... csexton 的答案不正确,因为用户无法访问 .svn 文件夹,但可以访问其中的任何文件!例如,您可以访问 http://myserver.com/.svn/entries
正确的规则是
RedirectMatch 404 /\\.svn(/.*|$)
我认为 Riccardo Galli 是对的。甚至 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 会以 404 响应,这很好。
但是,如果启用了“选项+索引”,那么用户仍然可以从父目录中看到“.svn”目录。
用户将无法进入该目录——这就是“404 Not Found”的来源。但是,他们将能够看到该目录并为可能的攻击者提供线索。
在我看来,Apache conf 应该是:
<Directory ~ "\.svn">
Order allow,deny
Deny from all
</Directory>
我不是很喜欢 RedirectMatch,所以我改用了 RewriteRule:
RewriteRule /\..*(/.*|$) - [R=404,L]
连字符的意思是“不要做任何替换”。我也无法弄清楚为什么在上面的示例中,正则表达式有两个反斜杠:
/\\..*(/.*|$)
所以我拿出了一个,它工作正常。我不明白为什么你会在那里使用两个。有人愿意开导我吗?
这:
RedirectMatch permanent .*\.(svn|git|hg|bzr|cvs)/.* /
如果您不想将错误发送回用户,也可以使用。
它只是重定向回站点根页面。此外,这是一个永久重定向,因此机器人不会尝试重新索引此 URL。
Apache Subversion FAQ 建议使用此解决方案:
# 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
RedirectMatch 与 mod_alias 中的其他指令一样,即使在不区分大小写的文件系统上也区分大小写(请参阅mod_alias 文档)。所以上面关于所有版本控制系统的匹配和阻止文件的答案是不正确的。
代替
RedirectMatch 404 /\\.(svn|git|hg|bzr|cvs)(/|$)
或者
RedirectMatch permanent .*\.(svn|git|hg|bzr|cvs)/.* /
像这样的东西是必要的
RedirectMatch 404 "(?i)/\.?(cvs|svn|git|hg|bzr)"
真正阻止一切,因为
我希望这会有所帮助。
在服务器配置文件的 .htaccess 中。
(1)
RewriteEngine on
RewriteRule "^(.*/)?\.git/" - [F,L]
和 (2)
RedirectMatch 404 /\.git
将这两种方法都放在.htaccess
文件中。
它通过返回 404 隐藏名称以 .git 开头的任何文件或目录,例如 .git 目录或 .gitignore 文件。
在您的 subversion 服务器安装中创建访问权限文件。
例如,如果您的文件夹结构是
/svn
/svn/rights/svnath.conf
创建一个配置文件并在您的 apache subversion 配置文件中输入该文件的路径,您通常可以在/etc/httpd/conf.d/subversion.conf找到该文件
在您的 svnath.conf 文件中,将权限定义为:
[foo.com:/trunk/source]
dev1=rw
dev2=rw .....
通过这种方式,您可以从单个文件和更精细的级别控制访问权限。
更多信息请阅读 svn 红皮书。