পটভূমি: নোডা টাইমে অনেক সিরিয়ালাইজযোগ্য স্ট্রাক্ট রয়েছে। আমি বাইনারি সিরিয়ালাইজেশন অপছন্দ করার সময়, আমরা এটি সমর্থন করার জন্য অনেক অনুরোধ পেয়েছি, ফিরে 1.x টাইমলাইনে। আমরা ISerializable
ইন্টারফেস প্রয়োগ করে এটি সমর্থন ।
আমরা NET টাইম 2.x এর একটি নেট ইস্যু রিপোর্ট পেয়েছি । নেট ফিডল এর মধ্যে ব্যর্থ । নোডা টাইম 1.x ব্যবহার করে একই কোডটি সূক্ষ্মভাবে কাজ করে। নিক্ষিপ্ত ব্যতিক্রমটি হ'ল:
সদস্যকে ওভাররাইড করার সময় উত্তরাধিকার সুরক্ষা বিধিগুলি লঙ্ঘন করা হয়েছে: 'নোডটাইম.ডায়রিশন.সিসটেম.রুনটাইম.সিরাইজেশন.আইরিয়াইজিবল.গেটঅবজেক্টডাটা (সিস্টেম.রুনটাইম.সিরাইজেশন.সরিয়ালাইজেশন ইনফো, সিস্টেম.রুনটাইম।সরিয়ালাইজেশন।স্ট্রিমিং কনটেক্সট)'। ওভাররাইডিং পদ্ধতির সুরক্ষার অ্যাক্সেসিবিলিটি ওভারড্রেন হওয়া পদ্ধতির সুরক্ষা অ্যাক্সেসিবিলিটির সাথে অবশ্যই মিলবে।
আমি এটিকে সংক্ষিপ্ত করে রেখেছি এমন ফ্রেমওয়ার্কটিতে: 1.x টার্গেটস। নেট 3.5 (ক্লায়েন্ট প্রোফাইল); 2.x লক্ষ্য। নেট 4.5। সাপোর্ট পিসিএল বনাম। নেট কোর এবং প্রকল্প ফাইল কাঠামোর ক্ষেত্রে তাদের বড় পার্থক্য রয়েছে, তবে দেখে মনে হচ্ছে এটি অপ্রাসঙ্গিক।
আমি এটি একটি স্থানীয় প্রকল্পে পুনরুত্পাদন করতে পরিচালিত করেছি, তবে আমি এর কোনও সমাধান পাইনি।
ভিএস2017 এ পুনরুত্পাদন করার পদক্ষেপ:
- একটি নতুন সমাধান তৈরি করুন
- একটি নতুন ক্লাসিক উইন্ডোজ কনসোল অ্যাপ্লিকেশন লক্ষ্যবস্তু তৈরি করুন। নেট 4.5.1। আমি এটিকে "কোডআরনার" বলেছি।
- প্রকল্পের বৈশিষ্ট্যগুলিতে, স্বাক্ষর করতে যান এবং একটি নতুন কী দিয়ে অ্যাসেম্বলি সাইন করুন। পাসওয়ার্ডের প্রয়োজনীয়তাটি আনটিক করুন এবং কোনও ফাইলের নাম ব্যবহার করুন।
- প্রতিস্থাপনের জন্য নিম্নলিখিত কোডটি আটকান
Program.cs
। এটি এই মাইক্রোসফ্ট নমুনায় কোডটির সংক্ষিপ্ত সংস্করণ । আমি সমস্ত পাথ একই করে রেখেছি, তাই আপনি যদি পুরো কোডটিতে ফিরে যেতে চান তবে আপনার আর কোনও পরিবর্তন করার দরকার নেই।
কোড:
using System;
using System.Security;
using System.Security.Permissions;
class Sandboxer : MarshalByRefObject
{
static void Main()
{
var adSetup = new AppDomainSetup();
adSetup.ApplicationBase = System.IO.Path.GetFullPath(@"..\..\..\UntrustedCode\bin\Debug");
var permSet = new PermissionSet(PermissionState.None);
permSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
var fullTrustAssembly = typeof(Sandboxer).Assembly.Evidence.GetHostEvidence<System.Security.Policy.StrongName>();
var newDomain = AppDomain.CreateDomain("Sandbox", null, adSetup, permSet, fullTrustAssembly);
var handle = Activator.CreateInstanceFrom(
newDomain, typeof(Sandboxer).Assembly.ManifestModule.FullyQualifiedName,
typeof(Sandboxer).FullName
);
Sandboxer newDomainInstance = (Sandboxer) handle.Unwrap();
newDomainInstance.ExecuteUntrustedCode("UntrustedCode", "UntrustedCode.UntrustedClass", "IsFibonacci", new object[] { 45 });
}
public void ExecuteUntrustedCode(string assemblyName, string typeName, string entryPoint, Object[] parameters)
{
var target = System.Reflection.Assembly.Load(assemblyName).GetType(typeName).GetMethod(entryPoint);
target.Invoke(null, parameters);
}
}
- "আনট্রেসডকোড" নামে আরও একটি প্রকল্প তৈরি করুন। এটি একটি ক্লাসিক ডেস্কটপ ক্লাস লাইব্রেরি প্রকল্প হওয়া উচিত।
- সমাবেশে স্বাক্ষর করুন; আপনি কোডরুনারের মতো একটি নতুন কী বা একই ব্যবহার করতে পারেন। (এটি আংশিকভাবে নোডা সময়ের পরিস্থিতি অনুকরণ করার জন্য এবং আংশিকভাবে কোড বিশ্লেষণকে সুখী রাখার জন্য))
- নিম্নলিখিত কোডটি আটকে দিন
Class1.cs
(সেখানে কী রয়েছে তা মুছে ফেলা):
কোড:
using System;
using System.Runtime.Serialization;
using System.Security;
using System.Security.Permissions;
// [assembly: AllowPartiallyTrustedCallers]
namespace UntrustedCode
{
public class UntrustedClass
{
// Method named oddly (given the content) in order to allow MSDN
// sample to run unchanged.
public static bool IsFibonacci(int number)
{
Console.WriteLine(new CustomStruct());
return true;
}
}
[Serializable]
public struct CustomStruct : ISerializable
{
private CustomStruct(SerializationInfo info, StreamingContext context) { }
//[SecuritySafeCritical]
//[SecurityCritical]
//[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
throw new NotImplementedException();
}
}
}
কোডআরনার প্রকল্প চালানো নিম্নলিখিত ব্যতিক্রম দেয় (পাঠযোগ্যতার জন্য পুনরায় ফর্ম্যাট করা):
আনহানডেল ব্যতিক্রম: সিস্টেম.রফলেশন.টারাজেট ইনভোকেশনএক্সেপশন: ব্যাতাকে একটি অনুরোধের
টার্গেট দ্বারা নিক্ষেপ করা হয়েছে।
--->
System.TypeLoadException:
সদস্যকে ওভাররাইড করার সময় উত্তরাধিকার সুরক্ষা বিধি লঙ্ঘন করা হয়েছে:
'অবিশ্বস্তকোড.কাস্টমস্ট্রাক্ট.সিস্টেম.রুনটাইম.সিরাইজেশন.আইরিয়ালাইজড.গেটঅবজেক্টডাটা (...)।
ওভাররাইডিং পদ্ধতির সুরক্ষার
অ্যাক্সেসিবিলিটি ওভারড্রেন হওয়া পদ্ধতির সুরক্ষা অ্যাক্সেসিবিলিটির সাথে অবশ্যই মিলবে ।
মন্তব্য করা আউট বৈশিষ্ট্যগুলি আমি চেষ্টা করেছি এমন জিনিসগুলি দেখায়:
SecurityPermission
দুটি পৃথক এমএস নিবন্ধ ( প্রথম , দ্বিতীয় ) দ্বারা সুপারিশ করা হয় , যদিও আকর্ষণীয়ভাবে তারা স্পষ্ট / অন্তর্নিহিত ইন্টারফেস প্রয়োগের চারপাশে বিভিন্ন জিনিস করেSecurityCritical
নোডা টাইমের বর্তমানে যা আছে, এবং এই প্রশ্নের উত্তরটি সেটাই বোঝায়SecuritySafeCritical
কিছুটা কোড বিশ্লেষণ নিয়মের বার্তা দ্বারা প্রস্তাবিত by- কোনও বৈশিষ্ট্য ছাড়াই কোড বিশ্লেষণের নিয়মগুলি খুশি - উভয়ই
SecurityPermission
বাSecurityCritical
বর্তমানের সাথে, বিধিগুলি আপনাকে বৈশিষ্ট্যগুলি অপসারণ করতে বলে - যদি না থাকে তবেAllowPartiallyTrustedCallers
। উভয় ক্ষেত্রেই পরামর্শগুলি অনুসরণ করা কোনও কাজে দেয় না। - নোডা টাইম এটি
AllowPartiallyTrustedCallers
প্রয়োগ করেছে; এখানে উদাহরণটি প্রয়োগ করা গুণাবলির সাথে বা ছাড়া কাজ করে না।
একটি ব্যতিক্রম ছাড়া কোড চালায় তাহলে আমি যোগ [assembly: SecurityRules(SecurityRuleSet.Level1)]
করতে UntrustedCode
সমাবেশ (এবং uncomment AllowPartiallyTrustedCallers
অ্যাট্রিবিউট), কিন্তু আমি বিশ্বাস করি যে যে অন্য কোড ব্যাহত পারে একটি দরিদ্র সমাধান।
.NET- এর সুরক্ষা দিকটি যখন আসে তখন আমি পুরোপুরি নষ্ট হয়ে যাওয়ার পুরোপুরি স্বীকার করি। সুতরাং আমি নেট নেট 4.5 কে লক্ষ্য করে কী করতে পারি এবং এখনও আমার প্রকারগুলি বাস্তবায়িত করার অনুমতি দেয় ISerializable
এবং এখনও। নেট ফিডল যেমন পরিবেশে ব্যবহার করা যায়?
(আমি যখন নেট নেট ৪.৫ লক্ষ্য করছি, আমি বিশ্বাস করি এটি নেট নেট security.০ সুরক্ষা নীতি পরিবর্তনের ফলে সমস্যাটি দেখা দিয়েছে, তাই ট্যাগ tag)
AllowPartiallyTrustedCallers
কৌশলটি করা উচিত, তবে এটি কোনও পার্থক্য বলে মনে হচ্ছে না