【发布时间】:2018-04-14 20:32:41
【问题描述】:
我有一个 C++ 程序,它允许用户输入任意 C#(.NET 兼容)脚本,然后在运行时对其进行解释,并允许用户通过我的程序的 C#(.NET)在一定程度上自定义我的程序的功能) API。
当用户将他们的工作保存在我的程序中时,他们的脚本会与他们的文件一起保存,并在下次运行程序并加载他们的文件时自动执行/解释。
显然,如果用户想用恶意代码破坏他们自己的机器,那么他们的权力就更大了。但是,由于我的软件的性质,它们很有可能让用户彼此共享文件……因此用户可能会向其他用户发送恶意代码(通过这个 C# 脚本接口)。
一些变通方法可能是在文件包含脚本时警告用户,在自动执行之前等……但这仍然留下错误的空间……如果用户错误地忽略了此类警告,他们仍然保持打开状态去攻击。
有没有办法获取一堆任意 C# 代码,并确定它是否包含可用于删除/重命名/移动/修改/损害系统文件的任何代码?基本上是一种确保某些任意 c# 代码不会尝试更改系统上的任何文件的方法?或者可能是一种简单地防止解释器加载任何文件访问 .NET 程序集的方法?
【问题讨论】:
-
你可以看看What is a partially trusted assembly/application/code/etc in .NET?——虽然我对partial trust知之甚少,不知道它是否对你有帮助。
-
您可能想阅读以下内容:docs.microsoft.com/en-us/dotnet/framework/misc/…,但请注意,目前不鼓励在您的场景中使用它。尽管如此,我还是会说它总比没有好。
-
如果您的程序真的只允许有能力的用户为自己编写 C# 脚本,那么可能根本没有必要清理脚本 - 毕竟他们会故意破坏自己而不是其他人。另一方面,如果您有类似插件系统的东西,其中可能会加载和执行不受信任的 3rd 方代码,那么 C# 脚本不是一个好方法。正如其他人所指出的,不推荐部分信任,因为它存在太多漏洞。相反,Javascript 或 Lua 等嵌入式脚本语言正是为此目的而开发的。
标签: c#