मैं 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 प्रतिबंधित करना चाहते हैं: अगर मैं अप्रतिबंधित करने के लिए अनुमति सेट उपरोक्त कोड काम करता है। मुझसे यहां क्या गलत हो रहा है?
नहीं है, कोड ठीक काम करता है अगर मैं अप्रतिबंधित करने के लिए PermissionSet निर्धारित किया है। मैं इसका उल्लेख करना भूल गया था इसलिए मैंने सवाल अपडेट किया। समस्या एक सुरक्षा अनुमति समस्या है। सुरक्षा अपवाद पहले mscorlib में होता है। चूंकि अपवाद स्टैक ऊपर जाता है क्योंकि यह एक लक्ष्यInvocationException उत्पन्न करता है। लेकिन सुरक्षा अपवाद वास्तविक समस्या है। – Galen
मैंने प्रश्नों के आधार पर उत्तर और ऊपर टिप्पणी के आधार पर उत्तर बदल दिया। – Simon
यदि मैं उपरोक्त जोड़ता हूं तो मुझे अभी भी वही सुरक्षा अपवाद मिलता है। – Galen