كيف يمكنني منع برمجية غير مصرح به من الوصول إلى التجمع في بلدي. NET 2.0؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

في 1.X .NET، يمكنك استخدام في StrongNameIdentityPermissionAttribute على التجميع الخاص بك لضمان هذا الرمز الوحيد الذي وقعه هل يمكن الوصول إلى التجميع الخاص بك. استنادا إلى وثائق MSDN،

<اقتباس فقرة>   

وفي .NET Framework الإصدار 2.0 و في وقت لاحق، ويطالب الهوية   أذونات غير فعالة إذا كان التجمع الاستدعاء لديه الثقة الكاملة.

وهذا يعني أن أي تطبيق مع الثقة الكاملة يمكن فقط تجاوز المطالب الأمنية بلدي.

وكيف يمكن منع برمجية غير مصرح به من الوصول إلى التجمع في بلدي. NET 2.0؟

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

المحلول

وحسب اقتراح اريك، وأنا حلها عن طريق التحقق من مفتاح نفسي. في رمز أريد أن أحمي، أود أن أضيف الدعوة التالية،

EnsureAssemblyIsSignedByMyCompany( Assembly.GetCallingAssembly() );

وبعد ذلك تنفيذ هذا الأسلوب هو

  /// <summary>
  /// Ensures that the given assembly is signed by My Company or Microsoft.
  /// </summary>
  /// <param name="assembly"></param>
  private static void EnsureAssemblyIsSignedByMyCompany( Assembly assembly )
  {
     if ( assembly == null )
        throw new ArgumentNullException( "assembly" );

     byte[] pubkey = assembly.GetName().GetPublicKeyToken();
     if ( pubkey.Length == 0 )
        throw new ArgumentException( "No public key token in assembly." );

     StringBuilder builder = new StringBuilder();
     foreach ( byte b in pubkey )
     {
        builder.AppendFormat( "{0:x2}", b );
     }
     string pkString = builder.ToString();
     if ( pkString != "b77a5c561934e089" /* Microsoft */ &&
          pkString != "abababababababab" /* Ivara */ )
     {
        throw new ArgumentException( "Assembly is not signed by My Company or Microsoft. You do not have permission to call this code." );
     }
  }
تغيرت

و** أسماء ومفاتيح لحماية الأبرياء. أي شبيهه بأسماء حقيقية أو الشركات هو مجرد صدفة. *

نصائح أخرى

وانظر هذا المقال:
HTTP: // blogs.msdn.com/ericlippert/archive/2008/10/06/preventing-third-party-derivation-part-two.aspx

وعلى وجه الخصوص هذا الجزء:

<اقتباس فقرة>   

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

     

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

وعلى ما يبدو، ورأى المصممين صافي أن هذه السمة لم تكن فعالة جدا لرمز الثقة الكاملة في صافي 1.X سواء.

وكما هو مبين جويل، أنت من الحظ فيما يتعلق CAS. ومع ذلك، قد تكون قادرا على القيام بما تحقق نفسك في أي الطريقة التي تحتاج إلى حماية باستخدام Assembly.GetCallingAssembly () للحصول على مرجع إلى تجمع يحتوي على التعليمات البرمجية الدعوة، ثم التحقق من اسم واضح على أن التجمع يدويا.

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