2014-01-14 58 views
4

我正在使用RazorEngine。我有一些动态模板,我将在运行时与视图模型绑定。我的要求是在沙箱中运行代码。所以,只有绑定将被允许。 RazorEngine允许我利用来运行任意应用程序域代码,在沙箱模式下执行任意C#代码?

using (var service = new IsolatedTemplateService(() => appDomain)) 
{ 
    return service.Parse(newTemplate, model, null, null); 
} 

如果我运行的应用程序域具有以下的许可,则它的工作原理,

var permissionSet = new PermissionSet(PermissionState.Unrestricted); 

,但如果我运行它使用这些权限,

var permissionSet = new PermissionSet(PermissionState.None); 
permissionSet.AddPermission(new SecurityPermission(PermissionState.Unrestricted)); 
permissionSet.AddPermission(new ReflectionPermission(PermissionState.Unrestricted)); 

我会得到,

[SecurityException: Request failed.] 
    System.AppDomain.CreateInstance(String assemblyName, String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) +0 
    RazorEngine.Templating.IsolatedTemplateService..ctor(Language language, Encoding encoding, IAppDomainFactory appDomainFactory) +408 
    RazorEngine.Templating.IsolatedTemplateService..ctor(Language language, Encoding encoding, Func`1 appDomainFactory) +73 
    RazorEngine.Templating.IsolatedTemplateService..ctor(Func`1 appDomainFactory) +41 

我需要授予特别许可吗?

+0

您能提供一些您希望允许/禁止的代码类型的示例吗?当你说只有绑定应该被允许时,我不确定你的意思。 – Levi

+0

@Levi,谢谢。我只需要在沙箱中运行RazorEngine(Razor.Parse)代码。因为,我允许用户动态创建Razor HTML模板。目前,这是非常危险的,因为用户可以放任意的C#代码。我相信这是可能的,因为dotnetfiddle.net就是一个例子。 – user960567

+0

Razor旨在运行任意C#代码。即使您可以对解析器进行沙盒处理(请参阅Andrew的回答,以了解为什么这种方式不可行),一旦运行时启动,您无法分开Razor引擎本身的.cshtml文件内容。当然,你可以撤消代码执行权限,但是Razor引擎甚至不会运行。 – Levi

回答

1

不幸的是,CodeDOM的API(这很可能是什么RazorEngine用来生成从剃刀编译器生成语法树C#代码)需要完全信任。除了强名和GAC之外,没有什么可以做的,因此您可以完全信任。不幸的是,因为它需要整个“FullTrust”权限集,所以您不能只授予特定权限。

+0

谢谢安德鲁。你可以给任何建议实现允许用户创建剃刀模板,但不允许他们把危险的C#代码?任何指针将不胜感激。 – user960567

+0

嗨,我有同样的问题。你有没有找到关于这个问题的答案? @ user960567 – Charles

+0

@Charles如果可以使用Roslyn? – user960567

0

您可能拥有强大的名称程序集,您需要应用AllowPartiallyTrustedCallers属性。

How to use the AllowPartiallyTrustedCallers attribute

+0

谢谢。我没有任何强名的议会。可能是RazorEngine.dll了。顺便说一句,现在我越来越'试图通过安全透明方法'TemplateGenerator.Generate(System.String,System.Object,Int32)'来访问安全关键方法'RazorEngine.Templating.IsolatedTemplateService..ctor(System.Func'1 < System.AppDomain>)'failed.' – user960567