我正在使用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
我需要授予特别许可吗?
您能提供一些您希望允许/禁止的代码类型的示例吗?当你说只有绑定应该被允许时,我不确定你的意思。 – Levi
@Levi,谢谢。我只需要在沙箱中运行RazorEngine(Razor.Parse)代码。因为,我允许用户动态创建Razor HTML模板。目前,这是非常危险的,因为用户可以放任意的C#代码。我相信这是可能的,因为dotnetfiddle.net就是一个例子。 – user960567
Razor旨在运行任意C#代码。即使您可以对解析器进行沙盒处理(请参阅Andrew的回答,以了解为什么这种方式不可行),一旦运行时启动,您无法分开Razor引擎本身的.cshtml文件内容。当然,你可以撤消代码执行权限,但是Razor引擎甚至不会运行。 – Levi