2011-11-22 14 views
5

मैं CSharpCodeProvider (VS2010 और .NET 4.0 का उपयोग करके) का उपयोग कर एक स्क्रिप्टिंग भाषा के रूप में सी # का उपयोग करने का प्रयास कर रहा हूं। मैं चाहता हूं कि न्यूनतम स्वीकृति वाले स्क्रिप्ट को प्रतिबंधित ऐपडोमेन में चलाया जाए। वर्तमान में, मुझे ऐपडोमेन में एक कक्षा को तुरंत चालू करने का प्रयास करते समय अपवाद मिल रहा है (पर कॉल करेंInInanceanceUUnwrap())। यहाँ कुछ सरल कोड है कि अपवाद को पुनरुत्पादित करता है:Sandboxed AppDomain में सुरक्षा अपवाद

using System; 
using System.Collections.Generic; 
using Microsoft.CSharp; 
using System.CodeDom; 
using System.CodeDom.Compiler; 
using System.Security; 
using System.Security.Policy; 
using System.Security.Permissions; 
using System.Reflection; 
using System.Runtime.Remoting; 

namespace ConsoleApp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // set permissions 
      PermissionSet permissions = new PermissionSet(PermissionState.None); 
      permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution)); 

      AppDomainSetup adSetup = new AppDomainSetup(); 
      adSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; 

      //Create a list of fully trusted assemblies 
      Assembly[] asms = AppDomain.CurrentDomain.GetAssemblies(); 
      List<StrongName> sns = new List<StrongName>(); 
      for (int x = 0; x < asms.Length; x++) 
      { 
       StrongName sn = asms[x].Evidence.GetHostEvidence<StrongName>(); 
       if (sn != null && sns.Contains(sn) == false) 
        sns.Add(sn); 
      } 
      //this includes: "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"    

      AppDomain domain = AppDomain.CreateDomain("NewAppDomain", AppDomain.CurrentDomain.Evidence, adSetup, permissions);//, sns);//, sn4, sn, sn2, sn3); 
      try 
      { 
       String asmName = Assembly.GetExecutingAssembly().FullName; 
       String typeName = typeof(ConsoleApp.ScriptRunner).FullName; 
       //Throws exception here 
       ScriptRunner scriptRunner = domain.CreateInstanceAndUnwrap(asmName, typeName) as ScriptRunner; 
      } 
      catch (SecurityException se) 
      { 
       System.Diagnostics.Debug.WriteLine(se.Message); 
      } 
      catch (Exception ex) 
      { 
       System.Diagnostics.Debug.WriteLine(ex.Message); 
      } 
     } 
    } 

    public class ScriptRunner : MarshalByRefObject 
    {  
     public ScriptRunner() 
     { 
      //A breakpoint placed here is never reached. 
      CompilerParameters param; 
      param = new CompilerParameters(); 
      param.CompilerOptions = ""; 
      param.GenerateExecutable = false; 
      param.GenerateInMemory = true; 
      param.IncludeDebugInformation = false; 

      // C# compiler 
      CSharpCodeProvider codeProvider = new CSharpCodeProvider(); 

      CompilerResults results = codeProvider.CompileAssemblyFromFile(param, "Danger.cs");   
     } 
    } 
} 

अपवाद mscorlib से फेंका जा रहा है और यह एक System.Reflection.TargetInvocationException एक आंतरिक System.Security.SecurityException किया है। यहां अपवाद है:

System.Reflection.TargetInvocationException was unhandled 
    Message=Exception has been thrown by the target of an invocation. 
    Source=mscorlib 
    StackTrace: 
     at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) 
     at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) 
     at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) 
     at System.Activator.CreateInstance(Type type, Boolean nonPublic) 
     at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) 
     at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) 
     at System.Activator.CreateInstance(String assemblyName, String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, Evidence securityInfo, StackCrawlMark& stackMark) 
     at System.Activator.CreateInstance(String assemblyName, String typeName) 
     at System.AppDomain.CreateInstance(String assemblyName, String typeName) 
     at System.AppDomain.CreateInstanceAndUnwrap(String assemblyName, String typeName) 
     at System.AppDomain.CreateInstanceAndUnwrap(String assemblyName, String typeName) 
     at ConsoleApp.Program.Main(String[] args) in C:\Documents and Settings\NaultyCS\my documents\visual studio 2010\Projects\ConsoleApplication4\ConsoleApplication4\Program.cs:line 46 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: System.Security.SecurityException 
     Message=Request failed. 
     Source=ConsoleApplication4 
     GrantedSet=<PermissionSet class="System.Security.PermissionSet" 
version="1"> 
<IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
version="1" 
Flags="Execution"/> 
</PermissionSet> 

     PermissionState=<PermissionSet class="System.Security.PermissionSet" 
version="1" 
Unrestricted="true"/> 

     RefusedSet="" 
     Url=file:///C:/Documents and Settings/NaultyCS/my documents/visual studio 2010/Projects/ConsoleApplication4/ConsoleApplication4/bin/Debug/ConsoleApplication4.EXE 
     StackTrace: 
      at ConsoleApp.ScriptRunner..ctor() 
     InnerException: 

तो ऐसा लगता है कि mscorlib पूर्ण विश्वास की मांग कर रहा है। मैंने इसे पूरी तरह भरोसेमंद असेंबली के रूप में जोड़ा है, लेकिन इसका कोई प्रभाव नहीं है।

PermissionSet permissions = new PermissionSet(PermissionState.Unrestricted); 

लेकिन मैं AppDomain प्रतिबंधित करना चाहते हैं: अगर मैं अप्रतिबंधित करने के लिए अनुमति सेट उपरोक्त कोड काम करता है। मुझसे यहां क्या गलत हो रहा है?

उत्तर

2

देर से संपादित करने के लिए खेद है। निम्नलिखित कोशिश करें। मैं इसे एक परीक्षण ऐप के साथ विजुअल स्टूडियो में चला गया और चला रहा था। एक तरफ ध्यान दें, मुझे व्यक्तिगत रूप से रचनाकारों में "तर्क" पसंद नहीं है क्योंकि वास्तविक त्रुटि थोड़ा छिपी हुई है। नीचे दिए गए चरणों में कंपाइल तर्क को कन्स्ट्रक्टर से एक नई विधि में ले जाया गया है।

  1. सुनिश्चित करें कि आपके कंसोल ऐप में एक स्ट्रॉन्गनाम/हस्ताक्षर है।
  2. स्नैप वैरिएबल को AppDomain.CreateDomain को कॉल करने के लिए अंतिम पैरामीटर के रूप में शामिल करें। LinkDemand अनुमति के लिए आपके ConsoleApp को पूर्ण रूप से विश्वसनीय होने की आवश्यकता है।

    AppDomain domain = AppDomain.CreateDomain("NewAppDomain", AppDomain.CurrentDomain.Evidence, adSetup, permissions, sns.ToArray()); 
    
  3. बदलें asmName अपने विधानसभा के लिए पूर्ण फ़ाइल पथ का उपयोग करें।

    String asmName = Assembly.GetExecutingAssembly().ManifestModule.FullyQualifiedName; 
    
  4. कोड

    var handle = Activator.CreateInstanceFrom(domain, asmName, typeName); 
    var scriptRunner = (ScriptRunner)handle.Unwrap(); 
    
  5. ले जाएँ इस तरह के "प्रारंभ" के रूप में एक नई विधि के लिए निर्माता से अपने सभी कोड की निम्न 2 लाइनों के लिए CreateInstanceAndUnwrap कॉल को हटा दें।

  6. स्टार्ट विधि को कॉल करने के लिए लाइन जोड़ें।

    scriptRunner.Start(); 
    
  7. अपनी Danger.cs फ़ाइल को पढ़ने के लिए FileIOPermission जोड़ें।

    permissions.AddPermission(new FileIOPermission(PermissionState.None) { AllFiles = FileIOPermissionAccess.Read }); 
    
+0

नहीं है, कोड ठीक काम करता है अगर मैं अप्रतिबंधित करने के लिए PermissionSet निर्धारित किया है। मैं इसका उल्लेख करना भूल गया था इसलिए मैंने सवाल अपडेट किया। समस्या एक सुरक्षा अनुमति समस्या है। सुरक्षा अपवाद पहले mscorlib में होता है। चूंकि अपवाद स्टैक ऊपर जाता है क्योंकि यह एक लक्ष्यInvocationException उत्पन्न करता है। लेकिन सुरक्षा अपवाद वास्तविक समस्या है। – Galen

+0

मैंने प्रश्नों के आधार पर उत्तर और ऊपर टिप्पणी के आधार पर उत्तर बदल दिया। – Simon

+0

यदि मैं उपरोक्त जोड़ता हूं तो मुझे अभी भी वही सुरक्षा अपवाद मिलता है। – Galen

संबंधित मुद्दे