Песочница Ironpython в C # SecurityException - PullRequest
5 голосов
/ 31 января 2012

Хорошо, вот что у меня есть

private static AppDomain CreateSandbox()
{
  var permissions = new PermissionSet(PermissionState.None);
  permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));

  permissions.AddPermission(new FileIOPermission(FileIOPermissionAccess.Read| FileIOPermissionAccess.PathDiscovery, AppDomain.CurrentDomain.BaseDirectory));
  var appinfo = new AppDomainSetup();
  appinfo.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;

  return AppDomain.CreateDomain("Scripting sandbox", null, appinfo, permissions, fullTrustAssembly);
}

И когда я пытаюсь загрузить неработающий код Python

try
{
    var src = engine.CreateScriptSourceFromString(s.Python, SourceCodeKind.Statements);
    src.Execute(ActionsScope);
}
catch (Exception e)
{
    ExceptionOperations eo = engine.GetService<ExceptionOperations>();
    string error = eo.FormatException(e);
    Debug.WriteLine(error);
}

Это дает мне SecurityException вместо того, чтобы позволить мнеувидеть фактическое исключение из кода.Если я установлю PermissionSet(PermissionState.Unrestricted), он будет работать нормально.

Любые идеи о том, какие разрешения мне нужны для того, чтобы отлавливать эти ошибочные ошибки?

System.Security.SecurityException was caught
  Message=Request failed.
  Source=Microsoft.Scripting
  GrantedSet=<PermissionSet class="System.Security.PermissionSet"
version="1">
<IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
version="1"
Read="F:\Programming\OCTGN\octgnFX\Octgn\bin\ReleaseMode with Debug\"
PathDiscovery="F:\Programming\OCTGN\octgnFX\Octgn\bin\ReleaseMode with Debug\"/>
<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:///F:/Programming/OCTGN/octgnFX/Octgn/bin/ReleaseMode with Debug/Microsoft.Scripting.DLL
  StackTrace:
       at Microsoft.Scripting.SyntaxErrorException.GetObjectData(SerializationInfo info, StreamingContext context)
       at System.Runtime.Serialization.ObjectCloneHelper.GetObjectData(Object serObj, String& typeName, String& assemName, String[]& fieldNames, Object[]& fieldValues)
       at Microsoft.Scripting.Hosting.ScriptSource.Execute(ScriptScope scope)
       at Octgn.Scripting.Engine.LoadScripts() in F:\Programming\OCTGN\octgnFX\Octgn\Scripting\Engine.cs:line 58
  InnerException: 

Ответы [ 2 ]

1 голос
/ 04 февраля 2012

Возможно, вы захотите попробовать перегрузку ObjectHandle ExecuteAndWrap (область действия ScriptScope, исключение ObjectHandle).Когда вы просто перехватываете исключение, оно отправляется из удаленного домена в ваш домен при его вызове, а затем обратно в удаленный домен при вызове FormatException.Похоже, что исключение происходит при маршалинге обратно в домен вашего приложения.

Если вы вызовете перегрузку ExecuteAndWrap, вы просто получите дескрипторы результата и возможного исключения и избежите сериализации - вы можете затем передатьдескриптор назад ExceptionOperations.FormatException.

1 голос
/ 31 января 2012

На основании трассировки стека в вашем коде есть синтаксическая ошибка, поэтому среда выполнения Python выдает SyntaxErrorException.Это исключение не перехватывается, поэтому его необходимо сериализовать через границу домена приложения.

Мне кажется, что проблема в том, что метод GetObjectData() из SyntaxErrorException помечен [SecurityCritical], что означает, что он может бытьвызывается только по полностью доверенному коду.

...