我正在研究 cs-script,我想知道它的安全性如何,开箱即用。我知道脚本是动态加载和卸载的,但是该脚本可以逃脱其执行程序集吗?即它可以使用反射在同一进程中访问和实例化来自其他程序集的类吗?
所以我的问题是 cs-script 默认情况下是否带有内置安全性,或者它不会打扰?
如果您的意思是根据http://www.csscript.net/的 CS-Script ,那么是的,它可以使用正常语法引用和调用其他程序集:
using MyOtherAssembly;
CS-Script 使用隐式加载来尝试根据 using 语句中的命名空间来确定要加载的程序集。这不能保证在所有情况下都有效,在这种情况下,您将需要使用显式加载,例如,您可以给 CS-Script 一个指令来显式加载所需的程序集:
//css_ref "..\MyOtherAssembly.dll"
using MyOtherAssembly;
//css_ref是一个特殊的注释,由 CS-Script 处理为加载程序集的指令,在这种情况下,引用的程序集位于脚本的父目录中。这与普通程序集的项目文件中的程序集引用执行类似的工作。您还可以使用 CS-Script 命令行显式加载程序集。
我还发现,如果在调用脚本之前已将引用的程序集加载到 AppDomain 中,则不需要使用隐式或显式加载。我假设 CS-Script 检测到命名空间已经存在于 AppDomain 中,因此不会为隐式加载而烦恼。
此处提供有关程序集加载的更多信息:http ://www.csscript.net/help/using_.net_assemblies.html 。
Edit1:您不能禁用隐式加载,但您可以将脚本放入没有任何其他程序集的目录中,这将阻止隐式加载能够找到任何其他程序集。该脚本仍然能够调用已加载的命名空间。但这只是“默默无闻的安全”;托管代码的本质意味着坚定的人始终可以通过反射访问您的代码。
简而言之:不,CS-script 不提供任何开箱即用的安全功能。
在这里回答:https ://stackoverflow.com/a/8692459/1657476
直接有吸引力的解决方案是使用 .NET Sandbox。它专为此类场景而设计。CLR 标准沙盒可用于使用 CS-Script 运行脚本的主机应用程序。这个想法是在加载可疑脚本之前初始化 CAS,其余的由 CLR 负责。如果您需要配置目录/文件权限,您可以使用 CAS 工具来完成。这种方式脚本是用户提供的例程的“传输”。CS-Script 是实现此类传输的便捷机制,但实际的安全问题由 .NET Sendoxing 解决,它具有全面的功能集,几乎涵盖了所有可能的安全场景。
使用带有 cs-script 的 .Net 安全凭证的示例可在以下位置获得:http ://www.csscript.net/Samples.html (sandbox.zip)
要安全地执行不受信任的 cs 脚本(尽可能隔离)AppDomain
,请在加载脚本(到新的应用程序域)之前创建一个具有安全限制的新脚本。然后可以在主域和脚本域之间编组数据。请参阅https://msdn.microsoft.com/en-us/library/bb763046%28v=vs.110%29.aspx