DllSpy

يقوم بمسح التجميعات (assemblies) المُترجَمة من .NET لاكتشاف أسطح الإدخال (نقاط نهاية HTTP، مراكز SignalR، خدمات WCF، خدمات gRPC، صفحات Razor، مكونات Blazor، دوال Azure، نقاط نهاية OData)، والتحقق من إعدادات التفويض، والإبلاغ عن المشكلات الأمنية — كل ذلك دون تشغيل التطبيق.
متوفر كأداة CLI ووحدة PowerShell.

التثبيت
CLI
dotnet tool install -g DllSpy
PowerShell
Install-Module -Name DllSpy
الاستخدام
CLI
# عرض جميع الأسطح
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
JSON + jq
# عرض جميع المسارات غير المحمية
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'
PowerShell
# جميع الأسطح
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 | الفئة الأساسية للـ Controller، [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 |
قواعد الأمان
نقاط نهاية HTTP
| الخطورة | القاعدة | الوصف |
|---|
| High | نقطة نهاية غير موثَّقة تُغيّر الحالة | DELETE, POST, PUT, أو PATCH بدون [Authorize] |
| Medium | إعلان تفويض مفقود | النقطة النهائية ليس لديها لا [Authorize] ولا [AllowAnonymous] |
| Low | تفويض بدون دور أو سياسة | [Authorize] موجود لكن بدون Roles أو Policy محددة |
دوال مراكز SignalR
| الخطورة | القاعدة | الوصف |
|---|
| High | دالة مركز غير موثَّقة | دالة مركز بدون [Authorize] (يمكن للعملاء استدعاؤها مباشرة) |
| Low | تفويض بدون دور أو سياسة | [Authorize] موجود لكن بدون Roles أو Policy محددة |
عمليات WCF
| الخطورة | القاعدة | الوصف |
|---|
| High | عملية WCF غير موثَّقة | عملية بدون [PrincipalPermission] أو [Authorize] |
| Low | تفويض بدون دور | [PrincipalPermission] موجود لكن بدون Role محددة |
عمليات gRPC
| الخطورة | القاعدة | الوصف |
|---|
| High | عملية gRPC غير موثَّقة | دالة خدمة بدون [Authorize] |
| Low | تفويض بدون دور أو سياسة | [Authorize] موجود لكن بدون Roles أو Policy محددة |
معالجات صفحات Razor
| الخطورة | القاعدة | الوصف |
|---|
| High | معالج غير موثَّق يُغيّر الحالة | معالج POST, PUT, DELETE, أو PATCH بدون [Authorize] |
| Medium | إعلان تفويض مفقود | المعالج ليس لديه لا [Authorize] ولا [AllowAnonymous] |
| Low | تفويض بدون دور أو سياسة | [Authorize] موجود لكن بدون Roles أو Policy محددة |
مكونات Blazor القابلة للتوجيه
| الخطورة | القاعدة | الوصف |
|---|
| High | مكون غير موثَّق وقابل للتوجيه | مكون مع [Route] لكن بدون [Authorize] |
| Low | تفويض بدون دور أو سياسة | [Authorize] موجود لكن بدون Roles أو Policy محددة |
دوال Azure
| الخطورة | القاعدة | الوصف |
|---|
| High | دالة Azure غير موثَّقة | AuthorizationLevel.Anonymous ولا يوجد خاصية [Authorize] |
| Low | تفويض بدون دور أو سياسة | [Authorize] موجود لكن بدون Roles أو Policy محددة |
نقاط نهاية OData
| الخطورة | القاعدة | الوصف |
|---|
| High | نقطة نهاية غير موثَّقة تُغيّر الحالة | DELETE, POST, PUT, أو PATCH بدون [Authorize] |
| Medium | إعلان تفويض مفقود | النقطة النهائية ليس لديها لا [Authorize] ولا [AllowAnonymous] |
| Low | تفويض بدون دور أو سياسة | [Authorize] موجود لكن بدون Roles أو Policy محددة |
الترخيص
انظر LICENSE.