3.0.0.1 版的 ASP.NET MVC 安全补丁中断了构建 [重复]

Posted

技术标签:

【中文标题】3.0.0.1 版的 ASP.NET MVC 安全补丁中断了构建 [重复]【英文标题】:ASP.NET MVC security patch to version 3.0.0.1 breaks build [duplicate] 【发布时间】:2014-12-11 23:11:21 【问题描述】:

安装 ASP.NET MVC 3 安全更新KB2990942 后,MVC 版本似乎从3.0.0.0 增加到3.0.0.1。这会导致 Visual Studio 不再找到引用。

<Reference Include="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />

Resharper 没有显示任何问题,但构建失败并出现许多未解决的 MVC 类型和警告:

警告:无法解析此引用。找不到 程序集“System.Web.Mvc,版本=3.0.0.0,文化=中性, PublicKeyToken=31bf3856ad364e35,processorArchitecture=MSIL"。检查到 确保程序集存在于磁盘上。如果需要此参考 根据您的代码,您可能会遇到编译错误。

这种说法是有道理的。我的机器上不再存在此版本。

我无法保证开发机器、构建服务器和生产服务器上的确切 MVC 版本。他们可能有3.0.0.03.0.0.1,这可能随时改变。 Windows 更新可能随时发布新的 MVC 版本。另外,我不想在发布 MVC 更新时增加所有 *.csproj 文件中的版本号。

多个版本受更新影响:

KB 2993939: Security Update for Microsoft ASP.NET MVC 2 KB 2993937: Security Update for Microsoft ASP.NET MVC 3 KB 2993928: Security Update for Microsoft ASP.NET MVC 4.0 KB 2992080: Security Update for Microsoft ASP.NET MVC 5.0

安全公告:MS14-059: Vulnerability in ASP.NET MVC Could Allow Security Feature Bypass (2990942)

处理这种情况的最佳方法是什么?我如何才能在未来的 MVC 更新中解开构建和生产并确保安全?

【问题讨论】:

今天与 4.0.0.1 相同的问题,我们只是重新引用了 System.Web.Mvc。有一个更强大的引用解决方案会很好。 您至少应该能够保证您的构建服务器和生产服务器在相同的环境中运行。开发机器可能会失去同步,但您可以在出现此类问题时进行处理。您的构建服务器应该能发现任何问题。 @Stijn 我打算这样做,但我不能保证更新会同时发生。开发过程必须在几周内自行运行,无需人工注意。 它并没有破坏 MVC 3 的生产。在 GAC 中,我发现了一个具有绑定重定向的“System.Web.Mvc.dll.config”。显然,CLR 正在使用这个文件。 相关:System.Web.MVC not copied to bin folder since MS14-059 【参考方案1】:

我通过以下方式解决了这个问题:

删除 MVC 引用并将正确的引用添加到项目中。 将引用的Copy Local 属性更改为true。 更新web.config中的bindingRedirect设置:

web.config runtime 部分:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.1" />
        </dependentAssembly>
    ...

更改Copy Local 设置将在您发布项目时将System.Web.MVC.dll 文件包含在bin 文件夹中,这样即使服务器未使用新版本更新也可以正常工作。

请注意,此类更新很少发生。这是 MVC 3 自发布以来的第一次修补。服务器更新后,您应该能够将Copy Local 改回false。下次微软进行这样的更新时,他们可能会知道先解决这样的问题。

【讨论】:

除了更改引用的复制本地属性之外,我也做了同样的事情。这似乎使我的项目工作。 请注意,这些补丁不会显示为已安装的更新,您必须查看 Asp.Net MVC # 下显示的正常添加删除程序,补丁时会有安装日期已申请(对我来说 10.15.2014) @EricBrown-Cal:你的意思是服务器版本更新吗?在我的电脑上,它显示为已安装的更新。 设置CopyLocal=true对我们没有帮助;见:System.Web.MVC not copied to bin folder since MS14-059 这部分解决了我的问题,因为我的解决方案再次构建。但是,它现在向我显示了几个警告:Assuming assembly reference 'System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' matches 'System.Web.Mvc, Version=3.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35', you may need to supply runtime policy【参考方案2】:

您的生产系统应该没问题,因为修补程序会将配置文件 (System.Web.Mvc.dll.config) 传送到以下文件夹:

%SystemRoot%\assembly\GAC_MSIL\policy.3.0.System.Web.Mvc\3.0.0.1__31bf3856ad364e35

配置文件包含重定向到新版本的程序集,这将覆盖您的 web.config 中的任何内容:

<?xml version="1.0"?>
<!-- http://msdn.microsoft.com/en-us/library/7wd6ex19.aspx#BKMK_Redirectingassemblyversionsbyusingpublisherpolicy -->
<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
                <bindingRedirect oldVersion="3.0.0.0-3.0.0.1" newVersion="3.0.0.1"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>

遵循@Guffa 为您的构建系统提供的建议,或使用 nuget 进行更新。我相信可行的解决方案取决于您如何将 MVC 二进制文件交付到您的系统(bin deploy 或 GAC)。

【讨论】:

在我的系统上找不到这个文件。此信息的任何参考? @julian 因为它是 gac,您可能必须使用提升的命令提示符遍历目录。另外我相信这仅适用于您安装了 mvc,如果您 nuget (bin deploy) mvc 这可能不存在于您的系统上。 有趣的是,人们可以 (1) 应用更新并获取此配置文件,然后 (2a) 返回并将他的 NuGet 包更新到最新版本,并且 (2b) 忘记或失败(例如从错误的还原)来更新您的 web.config 文件中的绑定重定向。结果?现有的服务器很好,但是如果您尝试部署到没有安装更新的新服务器(并且在看到加载旧版本之前不会提供),您会因为您的 bindingRedirect 错误而崩溃一路走来,你没有意识到——更新提供的这个额外的重定向拯救了你。【参考方案3】:

我使用 Nuget 在我的项目中安装了 Microsoft.AspNet.Mvc 包。

Install-Package Microsoft.AspNet.Mvc -Version <version> -Project PROJECTNAME 

MVC 4 version: 4.0.40804.0

MVC 3 version: 3.0.50813.1

这解决了问题。详情在这里: http://blogs.msdn.com/b/webdev/archive/2014/10/16/microsoft-asp-net-mvc-security-update-broke-my-build.aspx

【讨论】:

谢谢,这对我们来说是最好的解决方案,它消除了 GAC 中正确版本对构建代理的依赖【参考方案4】:

在我的案例中起作用的是更改项目文件中的Reference 元素,因此Version=3.0.0.0 现在是Version=3.0.0.1。我还将位于_bin_deployableAssemblies 文件夹中的System.Web.Mvc.dll 文件更新到新版本,并在Reference 元素中添加了一个HintPath 元素,指向所述dll,因此即使在GAC 中我们仍然有3.0.0.0 版本时它也会被拾取.

棘手的部分是不要忘记更新所有引用 System.Web.Mvc 的项目中的引用(例如,包括测试项目)。

【讨论】:

以上是关于3.0.0.1 版的 ASP.NET MVC 安全补丁中断了构建 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

asp.net mvc 站点的安全最佳实践?

ASP.NET MVC 和 WCF 服务安全 - 身份验证、路由

ASP.NET MVC Web API 身份验证令牌安全问题

ASP.NET Mvc5+EF7

如何在 ASP.NET MVC 网站中为 cookie 设置“安全”标志?

源码的说明 ASP.NET MVC 5框架揭秘.zip