TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.74K subscribers
Post #3310 1.46K
День 2765. #ЗаметкиНаПолях
Ограничьте Возможности NuGet-пакетов в Вашем Проекте

При добавлении NuGet-пакета в проект принято думать о нём только как о библиотеке времени выполнения. В действительности пакеты также могут импортировать свойства/таргеты MSBuild и анализаторы Roslyn. Эти ресурсы запускаются во время восстановления или сборки. Описание общих рисков безопасности и лучших практик можно найти тут.

Т.е. пакет может выполнять код на вашем компьютере или в CI без вашего ведома. Если вам нужна только часть ресурсов пакета, вы можете ограничить импорт, используя IncludeAssets и ExcludeAssets в PackageReference.

Почему это важно
Пакеты NuGet могут включать:
- файлы build, buildMultitargeting и buildTransitive (свойства и таргеты MSBuild);
- анализаторы (включая генераторы кода);
- библиотеки времени выполнения и компиляции.
Если вам не нужна логика сборки или анализаторы из пакета, их блокировка уменьшает поверхность атаки и делает сборки более предсказуемыми. Если вы читали последние новости об атаках на цепочки поставок, вы знаете, что любой код, работающий на вашей машине или в CI, представляет потенциальный риск. По умолчанию импортируются все ресурсы из пакета, поэтому важно помнить об этом и принимать меры при необходимости.

Включайте только то, что вам нужно
Наиболее безопасный подход часто заключается в разрешении только необходимых вам ресурсов:
<ItemGroup>
<PackageReference Include="Some.Package" Version="1.2.3">
<IncludeAssets>compile;runtime</IncludeAssets>
</PackageReference>
</ItemGroup>

При такой конфигурации NuGet не импортирует анализаторы и таргеты сборки из пакета.

Исключение определённых типов ресурсов
Если вы предпочитаете сохранить поведение по умолчанию и удалить только некоторые группы ресурсов, используйте ExcludeAssets:
<ItemGroup>
<PackageReference Include="Some.Package" Version="1.2.3">
<ExcludeAssets>analyzers;build;buildTransitive</ExcludeAssets>
</PackageReference>
</ItemGroup>

Это полезно, когда вам по-прежнему нужны другие ресурсы, такие как contentFiles.

Распространённые сценарии
Включать только ресурсы среды выполнения/библиотеки:
<PackageReference Include="Some.Package" Version="1.2.3">
<IncludeAssets>runtime;compile</IncludeAssets>
</PackageReference>


Включать библиотеку времени выполнения, отключить анализаторы:
<PackageReference Include="Some.Package" Version="1.2.3">
<ExcludeAssets>analyzers</ExcludeAssets>
</PackageReference>


Оставить анализаторы, отключить таргеты сборки:
<PackageReference Include="Some.Package" Version="1.2.3">
<ExcludeAssets>build;buildMultitargeting;buildTransitive</ExcludeAssets>
</PackageReference>


Использовать пакет только для сборки:
<PackageReference Include="Some.Package" Version="1.2.3" PrivateAssets="all">
<IncludeAssets>build;buildMultitargeting;buildTransitive</IncludeAssets>
</PackageReference>

Параметр "PrivateAssets="all" предотвращает транзитивное распространение зависимости на проекты, которые ссылаются на ваш проект.

Примечания и оговорки
- Для корректной работы некоторых пакетов требуются анализаторы или таргеты сборки. Тестируйте после изменения фильтров ресурсов.
- Предпочтительнее явно указывать и документировать выбор критически важных зависимостей в файлах .csproj.
- Сочетайте это с файлами блокировки пакетов и сопоставлением источников пакетов для более надёжной защиты цепочки поставок.

Источник:
https://www.meziantou.net/limit-what-nuget-packages-can-do-in-your-project.htm
  • 👍 3
More from @netdeveloperdiary
  1. Sep 26, 2026День 2796. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Продолжение Начало Три…
  2. Sep 25, 2026День 2795. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Начало Проблема с позиц…
  3. Sep 24, 2026День 2794. #Оффтоп #Здоровье Сегодня будет необычный пост. Завтра в Москве стартует конфер…
  4. Sep 23, 2026День 2793. #ЗаметкиНаПолях #SQL 10 Редких Возможностей SQL, Которые Стоит Знать Каждому. Ч…
  5. Sep 22, 2026День 2792. #ЗаметкиНаПолях #SQL 10 Редких Возможностей SQL, Которые Стоит Знать Каждому. Ч…
  6. Sep 21, 2026🔍Тестовое собеседование с Senior C# разработчиком уже завтра 22 сентября(уже завтра!) в 1…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →