TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.75K subscribers
Post #3037 2.52K
День 2525. #ЗаметкиНаПолях
Разбираем Веб-Метки Файлов в .NET

Веб-метка (Mark of the Web, MOTW) — это функция безопасности Windows, которая защищает пользователей от потенциально опасных файлов, загружаемых из интернета. При загрузке файла Windows автоматически добавляет специальный метатег, указывающий на то, что файл получен из ненадёжного источника и может содержать вредоносный контент. При попытке открыть файл с MOTW Windows отображает предупреждение или запрашивает подтверждение перед открытием.

Проверка MOTW перед обработкой файлов может помочь защитить приложение от уязвимостей безопасности. Проверяя происхождение файла, вы можете предотвратить выполнение вредоносного кода или открытие файлов, которые могут скомпрометировать систему пользователя.

MOTW реализован как альтернативный поток данных (ADS), прикреплённый к файлу. ADS содержит информацию об источнике файла, включая URL, с которого он был загружен, и его зону безопасности:
[ZoneTransfer]
ZoneId=3
ReferrerUrl=https://www.google.com/

ZoneId обозначает зону безопасности:
0 - Local Machine
1 - Intranet
2 - Trusted Sites
3 - Internet
4 - Untrusted

Мы можем использовать интерфейс IInternetSecurityManager для проверки файлов. Создадим консольное приложение.

Нам понадобятся:
- пакет Microsoft.Windows.CsWin32, который содержит генератор кода для работы с Win32;
- файл NativeMethods.txt в корне проекта с перечислением нужных нам API:
CoInternetCreateSecurityManager
MUTZ_NOSAVEDFILECHECK
MUTZ_REQUIRESAVEDFILECHECK

- вспомогательный enum:
enum UrlZone
{
Invalid = -1,
LocalMachine = 0,
Intranet = 1,
Trusted = 2,
Internet = 3,
Untrusted = 4,
}

Создадим статический класс для проверки MOTW:
public static class MOTW
{
[SupportedOSPlatform("windows")]
public static bool IsUntrusted(string path)
{
path = Path.GetFullPath(path);

var hr = PInvoke
.CoInternetCreateSecurityManager(
null,
out var secMgr,
0
);

if (hr.Failed || secMgr is null)
return true;

try
{
secMgr.MapUrlToZone(
path,
out var zone,
PInvoke.MUTZ_NOSAVEDFILECHECK);
if (zone >= (int)UrlZone.Internet)
return true;

secMgr.MapUrlToZone(
path,
out zone,
PInvoke.MUTZ_REQUIRESAVEDFILECHECK);
if (zone >= (int)UrlZone.Internet)
return true;

return false;
}
finally
{
Marshal.ReleaseComObject(secMgr);
}
}
}

Мы проверяем и сохраняемые, и уже сохранённые в доверенных зонах файлы.

Использование:
var path = @"C:\Users\user\Downloads\file.txt";
bool isUntrusted = MarkOfTheWeb.IsUntrusted(path);

Полный код, содержащий также методы установки и удаления ADS, см. в GitHub Meziantou.

Источник: https://www.meziantou.net/understanding-and-managing-mark-of-the-web-in-dotnet.htm
  • 👍 11
More from @netdeveloperdiary
  1. Sep 29, 2026Фото 3 (с) Анатолий Кулаков
  2. Sep 29, 2026День 2799. Конференция DotNext 2026. Часть 1 25 и 26 сентября в Москве прошла очередная ко…
  3. Sep 28, 2026День 2798. #Оффтоп Утиная Типизация в C# с Помощью Перехватчиков. Часть 2 Некоторое время…
  4. Sep 27, 2026День 2797. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Окончание Начало Продол…
  5. Sep 26, 2026День 2796. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Продолжение Начало Три…
  6. Sep 25, 2026День 2795. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Начало Проблема с позиц…
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 →