Install-Module -Name DllSpy
# すべてのサーフェスを一覧表示
dllspy ./MyApi.dll
# セキュリティ脆弱性をスキャン
dllspy ./MyApi.dll -s
# サーフェスタイプでフィルター (HttpEndpoint, SignalRMethod, WcfOperation, GrpcOperation, RazorPage, BlazorComponent, AzureFunction, ODataEndpoint)
dllspy ./MyApi.dll -t HttpEndpoint
# HTTPメソッドとクラス名でフィルター
dllspy ./MyApi.dll -m DELETE -c User*
# 認証済み/匿名サーフェスのみ
dllspy ./MyApi.dll --auth
dllspy ./MyApi.dll --anon
# ホスト(実行可能)アセンブリのみスキャン、クラスライブラリはスキップ
dllspy ./MyApi.dll --host-only
# 最小重要度でスキャン
dllspy ./MyApi.dll -s --min-severity High
# 出力形式: table (デフォルト), tsv, json
dllspy ./MyApi.dll -o json
dllspy ./MyApi.dll -o tsv
# 保護されていないルートをすべて一覧表示
dllspy ./MyApi.dll -o json | jq '[.[] | select(.requiresAuthorization == false) | .displayRoute]'
# タイプ別にサーフェスをカウント
dllspy ./MyApi.dll -o json | jq 'group_by(.surfaceType) | map({type: .[0].surfaceType, count: length})'
# セキュリティ問題をコンパクトなテーブルで表示
dllspy ./MyApi.dll -s -o json | jq -r '.[] | [.severity, .surfaceRoute, .title] | @tsv'
# すべてのサーフェス
Search-DllSpy -Path .\MyApi.dll
# サーフェスタイプでフィルター
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
# HTTPメソッドでフィルター
Search-DllSpy -Path .\MyApi.dll -HttpMethod DELETE
# クラス名でフィルター(ワイルドカード対応)
Search-DllSpy -Path .\MyApi.dll -Class User*
# 認証済み/匿名サーフェスのみ
Search-DllSpy -Path .\MyApi.dll -RequiresAuth
Search-DllSpy -Path .\MyApi.dll -AllowAnonymous
# ホスト(実行可能)アセンブリのみスキャン、クラスライブラリはスキップ
Search-DllSpy -Path .\bin\*.dll -HostOnly
# セキュリティ問題を検出
Test-DllSpy -Path .\MyApi.dll
# 高重要度の問題のみ
Test-DllSpy -Path .\MyApi.dll -MinimumSeverity High
# ホストアセンブリのみスキャンしてセキュリティ問題を検出
Test-DllSpy -Path .\bin\*.dll -HostOnly
# 詳細表示
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 | [Authorize] は存在するが、Roles または Policy が指定されていない |
| 重要度 | ルール | 説明 |
|---|---|---|
| 高 | 未認証のハブメソッド | [Authorize] がないハブメソッド(クライアントから直接呼び出し可能) |
| 低 | ロール/ポリシーなしの Authorize | [Authorize] は存在するが、Roles または Policy が指定されていない |
| 重要度 | ルール | 説明 |
|---|---|---|
| 高 | 未認証の WCF 操作 | [PrincipalPermission] または [Authorize] がない操作 |
| 低 | ロールなしの Authorize | [PrincipalPermission] は存在するが、Role が指定されていない |
| 重要度 | ルール | 説明 |
|---|---|---|
| 高 | 未認証の gRPC 操作 | [Authorize] がないサービスメソッド |
| 低 | ロール/ポリシーなしの Authorize | [Authorize] は存在するが、Roles または Policy が指定されていない |
| 重要度 | ルール | 説明 |
|---|---|---|
| 高 | 未認証の状態変更ハンドラー | POST、PUT、DELETE、または PATCH ハンドラーに [Authorize] がない |
| 中 | 認証宣言の欠落 | ハンドラーに [Authorize] も [AllowAnonymous] もない |
| 低 | ロール/ポリシーなしの Authorize | [Authorize] は存在するが、Roles または Policy が指定されていない |
| 重要度 | ルール | 説明 |
|---|---|---|
| 高 | 未認証のルーティング可能コンポーネント | [Route] があるが [Authorize] がないコンポーネント |
| 低 | ロール/ポリシーなしの Authorize | [Authorize] は存在するが、Roles または Policy が指定されていない |
| 重要度 | ルール | 説明 |
|---|---|---|
| 高 | 未認証の Azure Function | AuthorizationLevel.Anonymous かつ [Authorize] 属性がない |
| 低 | ロール/ポリシーなしの Authorize | [Authorize] は存在するが、Roles または Policy が指定されていない |
| 重要度 | ルール | 説明 |
|---|---|---|
| 高 | 未認証の状態変更エンドポイント | DELETE、POST、PUT、または PATCH に [Authorize] がない |
| 中 | 認証宣言の欠落 | エンドポイントに [Authorize] も [AllowAnonymous] もない |
| 低 | ロール/ポリシーなしの Authorize | [Authorize] は存在するが、Roles または Policy が指定されていない |
LICENSE を参照してください。