
Обнаруживайте входные поверхности и проблемы безопасности в скомпилированных сборках .NET — без их запуска.
Сканирует скомпилированные .NET сборки для обнаружения входных поверхностей (HTTP-конечные точки, хабы SignalR, службы WCF, службы gRPC, страницы Razor, компоненты Blazor, функции Azure, конечные точки OData), проверяет конфигурацию авторизации и отмечает проблемы безопасности — все без запуска приложения.
Доступен как CLI-инструмент и модуль PowerShell.

dotnet tool install -g DllSpy
Install-Module -Name DllSpy
# List all surfaces
dllspy ./MyApi.dll
# Scan for security vulnerabilities
dllspy ./MyApi.dll -s
# Filter by surface type (HttpEndpoint, SignalRMethod, WcfOperation, GrpcOperation, RazorPage, BlazorComponent, AzureFunction, ODataEndpoint)
dllspy ./MyApi.dll -t HttpEndpoint
# Filter by HTTP method and class name
dllspy ./MyApi.dll -m DELETE -c User*
# Only authenticated / anonymous surfaces
dllspy ./MyApi.dll --auth
dllspy ./MyApi.dll --anon
# Only scan host (runnable) assemblies, skip class libraries
dllspy ./MyApi.dll --host-only
# Scan with minimum severity
dllspy ./MyApi.dll -s --min-severity High
# Output format: table (default), tsv, json
dllspy ./MyApi.dll -o json
dllspy ./MyApi.dll -o tsv
# List all unprotected routes
dllspy ./MyApi.dll -o json | jq '[.[] | select(.requiresAuthorization == false) | .displayRoute]'
# Count surfaces by type
dllspy ./MyApi.dll -o json | jq 'group_by(.surfaceType) | map({type: .[0].surfaceType, count: length})'
# Security issues as compact table
dllspy ./MyApi.dll -s -o json | jq -r '.[] | [.severity, .surfaceRoute, .title] | @tsv'
# All surfaces
Search-DllSpy -Path .\MyApi.dll
# Filter by surface type
Search-DllSpy -Path .\MyApi.dll -Type HttpEndpoint
Search-DllSpy -Path .\MyApi.dll -Type SignalRMethod
Search-DllSpy -Path .\MyApi.dll -Type WcfOperation
Search-DllSpy -Path .\MyApi.dll -Type GrpcOperation
Search-DllSpy -Path .\MyApi.dll -Type RazorPage
Search-DllSpy -Path .\MyApi.dll -Type BlazorComponent
Search-DllSpy -Path .\MyApi.dll -Type AzureFunction
Search-DllSpy -Path .\MyApi.dll -Type ODataEndpoint
# Filter by HTTP method
Search-DllSpy -Path .\MyApi.dll -HttpMethod DELETE
# Filter by class name (supports wildcards)
Search-DllSpy -Path .\MyApi.dll -Class User*
# Only authenticated / anonymous surfaces
Search-DllSpy -Path .\MyApi.dll -RequiresAuth
Search-DllSpy -Path .\MyApi.dll -AllowAnonymous
# Only scan host (runnable) assemblies, skip class libraries
Search-DllSpy -Path .\bin\*.dll -HostOnly
# Find security issues
Test-DllSpy -Path .\MyApi.dll
# Only high-severity issues
Test-DllSpy -Path .\MyApi.dll -MinimumSeverity High
# Only scan host assemblies for security issues
Test-DllSpy -Path .\bin\*.dll -HostOnly
# Detailed view
Test-DllSpy -Path .\MyApi.dll | Format-List
| Фреймворк | Метод обнаружения | Тип поверхности |
|---|---|---|
| ASP.NET Core / Web API | Базовый класс контроллера, [ApiController], соглашение об именовании | HttpEndpoint |
| SignalR | Наследование Hub / Hub<T> | SignalRMethod |
| WCF | Интерфейсы [ServiceContract] + методы [OperationContract] | WcfOperation |
| gRPC | Сгенерированный базовый класс с BindService | GrpcOperation |
| Razor Pages | Наследование PageModel, методы On{Verb}[Handler][Async] | RazorPage |
| Blazor | Наследование ComponentBase + атрибут [Route] | BlazorComponent |
| Azure Functions | [FunctionName] / [Function] + параметр [HttpTrigger] | AzureFunction |
| OData | Наследование ODataController | ODataEndpoint |
| Серьёзность | Правило | Описание |
|---|---|---|
| Высокая | Неаутентифицированная изменяющая состояние конечная точка | DELETE, POST, PUT или PATCH без [Authorize] |
| Средняя | Отсутствует объявление авторизации | Конечная точка не имеет ни [Authorize], ни [AllowAnonymous] |
| Низкая | Авторизация без роли/политики | Присутствует [Authorize], но не указаны Roles или Policy |
| Серьёзность | Правило | Описание |
|---|---|---|
| Высокая | Неаутентифицированный метод хаба | Метод хаба без [Authorize] (напрямую вызывается клиентами) |
| Низкая | Авторизация без роли/политики | Присутствует [Authorize], но не указаны Roles или Policy |
| Серьёзность | Правило | Описание |
|---|---|---|
| Высокая | Неаутентифицированная операция WCF | Операция без [PrincipalPermission] или [Authorize] |
| Низкая | Авторизация без роли | Присутствует [PrincipalPermission], но не указана Role |
| Серьёзность | Правило | Описание |
|---|---|---|
| Высокая | Неаутентифицированная операция gRPC | Метод службы без [Authorize] |
| Низкая | Авторизация без роли/политики | Присутствует [Authorize], но не указаны Roles или Policy |
| Серьёзность | Правило | Описание |
|---|---|---|
| Высокая | Неаутентифицированный изменяющий состояние обработчик | Обработчик POST, PUT, DELETE или PATCH без [Authorize] |
| Средняя | Отсутствует объявление авторизации | Обработчик не имеет ни [Authorize], ни [AllowAnonymous] |
| Низкая | Авторизация без роли/политики | Присутствует [Authorize], но не указаны Roles или Policy |
| Серьёзность | Правило | Описание |
|---|---|---|
| Высокая | Неаутентифицированный маршрутизируемый компонент | Компонент с [Route], но без [Authorize] |
| Низкая | Авторизация без роли/политики | Присутствует [Authorize], но не указаны Roles или Policy |
| Серьёзность | Правило | Описание |
|---|---|---|
| Высокая | Неаутентифицированная функция Azure | AuthorizationLevel.Anonymous и отсутствует атрибут [Authorize] |
| Низкая | Авторизация без роли/политики | Присутствует [Authorize], но не указаны Roles или Policy |
| Серьёзность | Правило | Описание |
|---|---|---|
| Высокая | Неаутентифицированная изменяющая состояние конечная точка | DELETE, POST, PUT или PATCH без [Authorize] |
| Средняя | Отсутствует объявление авторизации | Конечная точка не имеет ни [Authorize], ни [AllowAnonymous] |
| Низкая | Авторизация без роли/политики | Присутствует [Authorize], но не указаны Roles или Policy |
См. LICENSE.