C# CS脚本是否提供开箱即用的沙盒?

C# CS脚本是否提供开箱即用的沙盒?,c#,security,cs-script,C#,Security,Cs Script,我正在研究cs脚本,我想知道它有多安全,开箱即用。我知道一个脚本是动态加载和卸载的,但是这个脚本能逃脱它正在执行的程序集吗?i、 它可以使用反射来访问和实例化同一进程中其他程序集中的类吗 因此,我的问题是,cs脚本在默认情况下是否具有内置安全性?如果您是指按照的cs脚本,那么它可以引用并调用其他程序集,语法正常: using MyOtherAssembly; CS脚本使用隐式加载来尝试根据using语句中的命名空间确定要加载的程序集。这并不能保证在所有情况下都能工作,在这种情况下,您需要使用显

我正在研究cs脚本,我想知道它有多安全,开箱即用。我知道一个脚本是动态加载和卸载的,但是这个脚本能逃脱它正在执行的程序集吗?i、 它可以使用反射来访问和实例化同一进程中其他程序集中的类吗


因此,我的问题是,cs脚本在默认情况下是否具有内置安全性?如果您是指按照的cs脚本,那么它可以引用并调用其他程序集,语法正常:

using MyOtherAssembly;
CS脚本使用隐式加载来尝试根据using语句中的命名空间确定要加载的程序集。这并不能保证在所有情况下都能工作,在这种情况下,您需要使用显式加载,例如,您可以给CS Script一个指令来显式加载所需的程序集:

//css_ref "..\MyOtherAssembly.dll"
using MyOtherAssembly;
//css\u ref是一条特殊注释,CS脚本将其作为加载程序集的指令处理,在这种情况下,引用的程序集位于脚本的父目录中。这与普通部件的项目文件中的部件引用的工作类似。还可以使用CS脚本命令行显式加载程序集

我还发现,如果在调用脚本之前已将引用的程序集加载到AppDomain中,则不需要使用隐式或显式加载。我假设CS脚本检测到名称空间已经存在于AppDomain中,因此不需要隐式加载

此处提供了有关程序集加载的详细信息:


Edit1:您不能禁用隐式加载,但可以将脚本放入没有任何其他程序集的目录中,这将阻止隐式加载找到任何其他程序集。脚本仍然能够调用已加载的名称空间。但这只是“默默无闻的安全”;托管代码的本质意味着一个有决心的人总是可以通过反射来访问您的代码。

简言之:不,CS脚本不提供任何现成的安全功能

答复如下:

最有吸引力的解决方案是使用.NET沙盒。它是 专为此类场景而设计。CLR标准 沙箱可用于运行脚本的主机应用程序 CS脚本。其思想是在加载 可疑脚本,其余由CLR负责。如果你 需要配置目录/文件权限您可以使用CAS进行配置 工具。这样,脚本编写就是例程的“传输” 由您的用户提供。CS脚本是一种方便的 实施这种运输,但实际的安全问题是 由.NET Sendoxing解决,它有一套全面的 功能涵盖几乎所有可能的安全场景。 通过CS脚本下载,您可以找到Sendboxing示例 (\Samples\Sandboxing),演示如何防止脚本 文件I/O操作(例如创建文件)

有关将.Net安全凭据与cs脚本一起使用的示例,请访问:(sandbox.zip)

要安全地执行不受信任的cs脚本(尽可能隔离),请在加载脚本(加载到新的应用程序域)之前,创建一个具有安全限制的新的
AppDomain
。然后可以在主域和脚本域之间封送数据。 看