الوصول إلى الطريقة الخاصة في تجميع مختلف C#

StackOverflow https://stackoverflow.com/questions/873150

  •  22-08-2019
  •  | 
  •  

سؤال

قد يكون هذا سؤالًا سخيفًا لأنني أستطيع أن أرى السبب الأمني ​​وراء حدوث ذلك بالطريقة التي يحدث بها ...

لدي مشروع ترخيص c#، ويحتوي هذا المشروع على فئة تحتوي على طريقة لإنشاء مفاتيح الترخيص الخاصة بي.لقد جعلت هذه الطريقة خاصة لأنني لا أريد أن يتمكن أي شخص آخر من الاتصال بطريقتي لأسباب واضحة

الشيء التالي الذي أريد القيام به هو أن تكون واجهة المستخدم الخاصة بي، الموجودة في مشروع C# آخر والتي تشير إلى ملف الترخيص dll هي "الشيء" الآخر الوحيد الذي يمكنه الوصول إلى هذه الطريقة خارج نفسها، هل هذا ممكن أم أحتاج إليه لنقله إلى نفس المشروع بحيث يتم تجميعه بالكامل إلى نفس ملف dll وأتمكن من الوصول إلى أعضائه؟

LicensingProject
-فئة الترخيص
--Private MethodX (إنشاء مفاتيح الترخيص)

LicensingProject.UI
-ترخيص UiClass
--أريد أن أكون الفصل الوحيد الذي يمكنه الوصول إلى MethodX

هناك سبب لعدم وجود منشئ مفتاح الترخيص في واجهة المستخدم فقط، وذلك لأن الترخيص يعمل عن طريق إنشاء تجزئة على نفسه ومقارنتها بتلك التي تم إنشاؤها بواسطة منشئ الترخيص.

أفضّل عدم التحويل إلى ملف dll لأن المستخدمين النهائيين لا يحتاجون إلى رمز واجهة المستخدم.

أعلم أن الطريقة الخاصة بالفطرة السليمة هي مجرد ذلك.أنا في حيرة من أمري.

هل كانت مفيدة؟

المحلول

هل يمكن جعله وسيلة الداخلي، واستخدام InternalsVisibleToAttribute لإعطاء LicensingProject.UI الوصول اضافية لLicensingProject.

ونقطة Merhdad حول إنفاذ صحيحة وخاطئة في نفس الوقت. إذا لم يكن لديك ReflectionPermission ، و سوف CLR يمنعك من تسمية الأشياء التي لا ينبغي - ولكن إذا كنت تستخدم انعكاس من جمعية موثوق به تماما، يمكنك استدعاء أي شيء. يجب أن نفترض أن القراصنة المحتملين قادر على تشغيل تجميع موثوق به تماما على آلته الخاصة:)

لا شيء من هذا سيوقف أي شخص من استخدام العاكس لفك الشفرة. وبعبارة أخرى، مما يجعل من القطاع الخاص ليس <م> حقا إضافة كمية كبيرة من الأمن لنظام الترخيص الخاص بك. إذا كان أي شخص يضع في الواقع أي جهد في كسرها، وأنها سوف تكون على الأرجح قادرة على.

نصائح أخرى

هذا هو حقا تعليق, ردًا على نقطة مهرداد بشأن عدم إجراء عمليات التحقق من الوصول في وقت التشغيل؛هنا، يمكنك رؤية JIT (كما يتضح) وهو يقوم بفحص الوصول - وليس الانعكاس، وليس مترجم C#.

لإصلاح الكود، قم بعمل Foo.Bar عام.ومن المثير للاهتمام أنه يتحقق من ذلك أيضًا Foo يمكن الوصول إليه - لذا قم بذلك Foo الداخلية لرؤية المزيد من الألعاب النارية:

using System;
using System.Reflection;
using System.Reflection.Emit;
static class Program {
    static void Main() {
        MethodInfo bar = typeof(Foo).GetMethod("Bar",
            BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
        var method = new DynamicMethod("FooBar", null, new[] {typeof(Foo)});
        var il = method.GetILGenerator();
        il.Emit(OpCodes.Ldarg_0);
        il.EmitCall(OpCodes.Callvirt, bar, null);
        il.Emit(OpCodes.Ret);

        Action<Foo> action = (Action<Foo>) method.CreateDelegate(typeof(Action<Foo>));
        Foo foo = new Foo();
        Console.WriteLine("Created method etc");
        action(foo); // MethodAccessException
    }
}

public class Foo {
    private void Bar() {
        Console.WriteLine("hi");
    }
}

وpublic، private، ... الاشياء هي القسري فقط من قبل المجمع. يمكنك استخدام انعكاس للوصول إليها بسهولة جدا (على افتراض رمز وقد تطلب أذونات، وهو افتراض معقول كما لديه السيطرة الكاملة على الجهاز). لا تعتمد على أن لا أحد على افتراض أن نسميها.

وFoo.Bar يمكن أن يقيم الخاص ... لإصلاح التعليمات البرمجية أعلاه، إضافة معلمة واحدة على نهاية DynamicMethod المنشئ:

var method = new DynamicMethod("FooBar", null, new[] {typeof(Foo)}, true);

واضافة حقيقية لتخطي الشيكات JIT الرؤية على أنواع وأفراد الوصول إليها من قبل MSIL من الأسلوب الديناميكي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top