2015-04-09 1 views
3

Это мой код:Sandboxing ненадежного код в C#, Разрешение безопасности, похоже, не работает

System.Security.PermissionSet PS = new System.Security.PermissionSet(PermissionState.None); 
PS.AddPermission(new FileIOPermission(FileIOPermissionAccess.AllAccess,Path)); 
PS.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution)); 
AppDomainSetup ADS = new AppDomainSetup(); 
ADS.ApplicationBase= Path;   
AppDomain domain = AppDomain.CreateDomain("Pluging", null, ADS, PS, null);    
Assembly asm = Assembly.LoadFrom(Path + "MacroBase.dll"); 
domain.Load(asm.FullName); 
MacroBase.MacroBase em = (MacroBase.MacroBase)domain.CreateInstanceAndUnwrap(asm.FullName, "MacroBase.MacroBase"); 
em.Application(1); 

параметр Path имеет адрес floder, который содержит DLL. Прямо сейчас это «D: \ Program Projects \ Server3 \ Macros \ c7b465b2-8314-4c7e-be3c-10c0185b4ac6» копия файла macrobase.dll находится внутри папки Guid. Appdomain загружает эту dll и запускает метод Application.

Я ожидал, что последняя строка не будет иметь доступ к C: \ вследствие FileIOPermissionAccess, который был применен в начале, но упомянутый метод:

MacroBase.Application(int i) 
{ 
    System.IO.File.ReadAllBytes("c:\\test1_V.103.xls"); 
} 

работает, как если бы он был полностью неограниченным.

на основе этой статьи от Microsoft: How to: Run Partially Trusted Code in a Sandbox Я также попытался следующий формат без каких-либо лучших результатов (это может получить доступ к C :):

System.Security.PermissionSet PS = new System.Security.PermissionSet(PermissionState.None); 
PS.AddPermission(new FileIOPermission(FileIOPermissionAccess.AllAccess,Path)); 
PS.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution)); 
AppDomainSetup ADS = new AppDomainSetup(); 
ADS.ApplicationBase= Path;   
AppDomain domain = AppDomain.CreateDomain("Pluging", null, ADS, PS, null);    
Assembly asm = Assembly.LoadFrom(Path + "MacroBase.dll"); 
domain.Load(asm.FullName); 
System.Runtime.Remoting.ObjectHandle handle = Activator.CreateInstanceFrom(domain, Path + "MacroBase.dll", "MacroBase.MacroBase"); 
MacroBase.MacroBase m = (MacroBase.MacroBase)handle.Unwrap(); 
m.Application(1); 

MacroBase.Macrobase является заполнителем для будущих макросов. Он помещается внутри dll macrobase.dll. Сейчас он содержит только фиктивный код:

namespace MacroBase 
{ 
    [Serializable] 
    public class MacroBase 
    { 
     public void Application(int i) 
     { 

      List<int> i1 = new System.Collections.Generic.List<int>() { 1,2,3,4}; 

      System.IO.File.ReadAllBytes("c:\\test1_V.103.xls"); 
      switch(i) 
      { 
       case 0: 
        break; 
       case 1: 
        break; 
       default: 
        break; 
      } 
     } 
    } 
} 
+1

Но разве вы просто не добавили 'FileIOPermissionAccess.AllAccess' и' SecurityPermissionFlag.Execution', сразу после этой первой строки кода? –

+0

Какова ценность 'Path'? в вашей строке 'PS.AddPermission (новый FileIOPermission (FileIOPermissionAccess.AllAccess, Path));' – DWright

+0

Показать определение 'MacroBase.MacroBase'. – PetSerAl

ответ

4

Ваш класс, помеченный как [Serializable] и не вытекает из MarshalByRefObject, это означает, что, когда экземпляр получить через границы домена приложения, то получить сериализации и десериализации, чем в целевом домене. Таким образом, ваш код будет выполнен в вашем текущем домене, а не в отдельном домене. Вы должны получить свой класс MacroBase.Macrobase от MarshalByRefObject, чтобы код выполнялся в отдельном домене.

+0

Спасибо, это сработало. Теперь я понимаю, почему образец Microsoft заканчивается тем, что класс макроса для класса MarshalByRefObject. –

+0

Вы спасли мою неделю! –

 Смежные вопросы

  • Нет связанных вопросов^_^