忽略 IIS 下的 .svn 目录

忽略 IIS 下的 .svn 目录

我们是一家网络开发组织,最近开始使用 Subversion 作为版本控制系统。由于执行更新比导出和复制文件快得多,开发人员希望能够让生产服务器成为工作副本。

我唯一担心的是系统中散落着的所有 .svn 文件,以及一些企业个人可能会读取其中文件的内容,可能向他们提供我们不希望他们知道的信息。

阻止 IIS 提供这些 .svn 目录内的任何内容的最好/最简单的方法是什么?

答案1

“不要那样做”并不能回答这个问题。

实际上,我喜欢在生产服务器上拥有一个工作副本,因为这样我可以在生产中快速做出更改(谁从来没有这样做过?)并重新检查它们。这取决于您希望将安全/便利滑块放在哪里,在许多情况下,这是一个好地方。

Apacheland 的标准解决方案是将 .svn 文件保留在那里,但告诉 Web 服务器永远不要提供这些文件。以下是使用 Windows 2000-2008 上的 IIS 5-7 执行此操作的方法。

  1. 下载并安装ISAPI_重写-- 精简版就足以满足此目的。请注意额外的系统要求适用于 Win 2008。 警告-- MSI 安装程序停止并启动 IIS。

  2. 取消选中“只读”框httpd配置文件文件的属性。如果你使用 MSI 安装程序,则有一个快捷方式指向httpd配置文件在开始菜单中的文件Helicon->ISAPI_Rewrite

  3. 将这些行添加到httpd配置文件

ISAPI_Rewrite 指令httpd配置文件

# Deny access to Subversion working copy administrative
#  directories (.svn) and their contents
RewriteRule .*/\.svn\b.* . [F,I,O]

现在,任何对 .svn 目录或其内容的请求都将导致服务器出现 404 Not Found。

答案2

您可以确保 IIS 使用的任何用户帐户都无权访问 .svn 目录。

您可以手动执行此操作(不推荐),也可以使用类似 MrJangles 的删除脚本,该脚本可以在您执行 SVN 更新后触发运行,也可以作为计划任务定期运行:

for /r YOURPATH %f in (.svn) do icacls /deny <name_of_iis_user>:F "%f"

(注意:我没有测试过上述内容,在生产中依赖它之前,您需要检查它是否执行了它所尝试的操作,有关更多信息,请参阅“icacls /help”的输出)

(另请注意:“icacls”是 Vista/2008 命令,在早期的 Windows 版本中,该命令为“cacls”)

答案3

使用 IIS 7,打开 IIS 管理器,选择服务器节点,双击处理程序映射功能。单击操作添加托管处理程序并按如下方式配置处理程序:

  • 请求路径:*.svn/*(所有 .svn 文件夹中的所有文件的通配符映射)
  • 类型:系统.Web.HttpForbiddenHandler
  • 姓名:Subversion 元数据(如果你愿意,可以选择其他名称)

现在,对所有站点中名为 .svn 的 Subversion 元数据文件夹中的文件的任何请求都应返回以下内容:

‘/’应用程序中的服务器错误。

不提供此类页面。

描述:您请求的页面类型无法使用,因为该页面已被明确禁止。请检查以下 URL 并确保其拼写正确。

请求的 URL:/.svn/text-base/Default.aspx.svn-base

如果需要,您可以选择不同的处理程序类型,也许是返回 404 状态代码的 FileNotFound 处理程序。

对于 IIS 6 (已安装并配置 ASP.NET 2):

导航到主目录 > 配置 > 映射并将.svn-base扩展映射到%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll。然后在 machine.config 中(您可以在中找到%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\CONFIG),您可以为扩展添加与上面相同的处理程序,将以下 XML 元素添加为元素的子元素<httpHandlers>

<add verb="*" path="*.svn-base" type="System.Web.HttpForbiddenHandler"/>

这只会阻止访问者请求源代码文件,他们仍然可以从 .svn 文件夹请求其他文件。将更多扩展名映射到 aspnet_isapi.dll 或进行通配符映射(会影响性能),您可以阻止更多文件被请求。

答案4

不要使用 subversion。说真的。

从您的评论来看,您使用的工具似乎不对。Subversion 是开发人员的好工具,但它不是部署/镜像工具。如果您的目标只是以最少的带宽和时间将文件从暂存/测试服务器复制到生产服务器,那么我建议您使用同步。现在,由于我是一名 Unix 管理员,可能有一些我不知道的与 rsync 等效的 Windows 版本,因此您可能需要进行一些研究。但是,您可以在以下版本中使用 rsync赛格威或者同步

Rsync 允许你将一台服务器上的目录与另一台服务器上的目录进行镜像。它会计算两台服务器之间的增量,然后仅有的复制差异。不仅如此,它还会压缩差异,还可以选择加密差异。

相关内容