Патч для защиты ASP.NET MVC до версии 3.0.0.1 breaks build
После установки обновления для системы безопасности 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, Version = 3.0.0.0, Культура = нейтральная, PublicKeyToken = 31bf3856ad364e35, processorArchitecture = MSIL". убедитесь, что сборка существует на диске. Если требуется эта ссылка по вашему коду вы можете получить ошибки компиляции.
Такой подход имеет смысл. Эта версия больше не существует на моей машине.
Я не могу гарантировать точную версию MVC на машинах dev, создавать серверы и производственные серверы. Они могут иметь 3.0.0.0
или 3.0.0.1
, и это может измениться в любое время. Windows Update может выпускать новые версии MVC в любое время. Кроме того, я не хочу увеличивать номер версии во всех *.csproj файлах при выпуске обновления MVC.
Обновление зависит от нескольких версий:
Бюллетень по безопасности: MS14-059: Уязвимость в ASP.NET MVC делает возможным обход безопасности (2990942)
Какой лучший способ справиться с этой ситуацией? Как я могу разблокировать сборку и производство и быть в безопасности в отношении будущих обновлений MVC?
Ответы
Ответ 1
Я исправил это следующим образом:
- Удаление ссылки MVC и добавление правильной ссылки на проект.
- Изменение свойства
Copy Local
ссылки на true
.
- Обновите параметр
bindingRedirect
в web.config
:
раздел 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
после обновления серверов. В следующий раз, когда Microsoft сделает такое обновление, они, вероятно, узнают, что сначала исправят такие проблемы.
Ответ 2
Я установил пакет Microsoft.AspNet.Mvc в свой проект, используя Nuget.
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
Ответ 3
Ваша производственная система должна быть в порядке, поскольку исправление предоставляет файл конфигурации (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 или GAC).
Ответ 4
Что в моем случае было изменить элемент Reference
в файле проекта, поэтому Version=3.0.0.0
теперь Version=3.0.0.1
. Я также обновил файл System.Web.Mvc.dll
, сидящий в папке _bin_deployableAssemblies
, в новую версию и добавил элемент HintPath
в элементе Reference
, указывающем на указанную DLL, чтобы он поднялся, даже когда в GAC у нас все еще есть версия 3.0.0.0.
Сложная часть состоит в том, чтобы не забывать обновлять ссылку во всех проектах, ссылающихся на System.Web.Mvc
(например, включая тестовый проект).