忽略IIS下的.svn目录

我们是一个Web开发组织,最近已经转向使用颠覆版本控制系统。 由于执行更新比导出和复制文件要快得多,开发人员希望能够将生产服务器作为工作副本。

我唯一担心的是整个系统中散布的所有.svn文件,以及一些企业的个人可能会读取其中的文件内容,可能给他们提供的信息,我们宁愿他们没有。

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

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

实际上,我喜欢在生产服务器上有一个工作副本,因为这样我可以对生产进行快速更改(谁从来没有这样做过?),并检查它们。这取决于您希望安全/便捷滑块的位置,以及在很多情况下这是一个好地方。

Apacheland中的标准解决scheme是将.svn文件保留在那里,但告诉Web服务器永远不要为它们服务。 以下是在Windows 2000-2008上使用IIS 5-7的方法。

  1. 下载并安装ISAPI_Rewrite – Lite版本就足够了。 请注意Win 2008的额外系统要求 。 警告 – MSI安装程序停止并启动IIS。

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

  3. 将这些行添加到httpd.ini中

httpd.ini中的 ISAPI_Rewrite指令:

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

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

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

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

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

(注意:我没有testing过上面的内容,你需要检查它是否在生产中依赖它,请参阅“icacls / help”的输出了解更多信息)

(另一个注意:“icacls”是一个Vista / 2008的命令,在早期的Windows变体中,命令是“cacls”)

使用IIS 7,打开IISpipe理器,select服务器节点,双击处理程序映射function。 单击操作添加托pipe处理程序并configuration处理程序,如下所示:

  • 请求path: * .svn / * (所有.svn文件夹中所有文件的通配符映射)
  • types: System.Web.HttpForbiddenHandler
  • 名称: Subversion – 元数据 (如果你喜欢,你可以select一个不同的名字)

现在任何请求在站点名为.svn的Subversion元数据文件夹中的文件都应该返回:

“/”应用程序中的服务器错误。

这种types的页面不提供。

说明:您所请求的页面types未被投放,因为它已被明确禁止。 请查看下面的url,并确保拼写正确。

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

如果你愿意,你可以select不同的处理程序types,可能是一个FileNotFound处理程序,它将返回一个404状态码。

对于IIS 6(安装和configurationASP.NET 2):

导航到主目录>configuration>映射并将.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或进行通配符映射(将影响性能),并阻止请求更多文件。

从纯粹的安全angular度来看,我会重新教育你的开发者。

如果您牺牲安全性,轻松部署并不一定是个好主意。

您正在计划阻止访问敏感信息的configuration。 如果configuration意外改变,会发生什么情况。 如果IIS hotFix发生故障并更改了configuration的工作方式,会发生什么情况? 如果您使用的第三方库出现故障并停止工作,会发生什么情况。 我可以想到几个极有可能发生的事件,这些事件会破坏你的configuration并允许访问这些文件,因为首先没有服务器上的文件,这将完全减弱

您应该创build一个部署脚本,从临时服务器复制相应的文件。 你甚至可以通过SVN到Prod上的不同目录。

要进行部署,可以使用RoboCopy和/ XD命令来排除.svn目录。 您可以使用Microsoft Web部署工具并使用该工具限制目录。 如果你需要的话,你可以for /r YOURPATH %f in (.svn) do rd /s /q "%f"部署和运行上面for /r YOURPATH %f in (.svn) do rd /s /q "%f"

只是不要将这些目录部署到生产网站。

不要使用颠覆。 认真。

从您的意见看来,你正在使用错误的工具来完成这项工作。 对于开发人员来说,Subversion是一个很好的工具,但它不是一个部署/镜像工具。 如果您的目标是简单地将文件从暂存/testing服务器以最less带宽和时间复制到生产服务器,那么我build议您使用rsync 。 现在,由于我是一个Unixpipe理员,可能有一些与我不知道的rsync等价的,所以你可能想做一些研究。 但是,您可以在Cygwin或cwrsync下使用rsync。

Rsync允许您在一台服务器上镜像另一台服务器上的目录。 它计算两个服务器之间的增量,并复制差异。 不仅如此,它压缩了三angular洲,也可以encryption。

最佳做法是在SVN更新后导出和发布的自动部署系统。 以Hudson为例。 还有几个,但是因为我们不需要一个,我不是很了解

Greetz,GHad

我在我的生产服务器上安排了一个search.svn的脚本,并简单地删除这些文件。 我不认为这会在你的情况下工作。

 for /r YOURPATH %f in (.svn) do rd /s /q "%f" 

如果删除文件不是一个选项,您可以通过IIS(密码或IP限制)在目录上设置基本的安全性。 这将阻止IIS向未经授权的用户提供内容。

祝你好运!