我有这样的代码:
namespace NetHacking
{
interface IPlugin
{
void Execute(PluginData data);
}
public class PluginData
{
private readonly string ConstString = "Const data";
public void Print()
{
Console.WriteLine(ConstString);
}
}
[StructLayout(LayoutKind.Explicit)]
class ExternalPlugin : IPlugin
{
internal class PluginHack
{
public string Text;
}
[FieldOffset(0)]
private PluginData _original;
[FieldOffset(0)]
private PluginHack _hack;
public void Execute(PluginData data)
{
_original = data;
_hack.Text = "Hacking .NET";
}
}
class Program
{
static void Main(string[] args)
{
try
{
var data = new PluginData();
var plugin = CreatePlugin();
plugin.Execute(data);
data.Print();
}
catch (Exception)
{
Console.WriteLine("Error!");
}
Console.WriteLine("End");
Console.Read();
}
private static IPlugin CreatePlugin()
{
return new ExternalPlugin();
}
}}
在上面的示例中, PluginData数据包含只读字符串ConstString 字符串。理论上,传递给IPlugin中的Execute方法的PluginData应该用于初始化插件。不幸的是, ExternalPlugin 可以在外部覆盖ConstString。
有没有办法防止这种情况?
答案 0 :(得分:4)
如果您想保护自己免受恶意插件篡改您的应用程序,您应该使用权限有限的自己的AppDomain运行它们,并通过定义良好的界面与插件进行通信。不要直接访问您的程序状态到插件。当然,该插件仍然可以修改您发送的任何数据的副本,但您的数据副本不会受到影响。
答案 1 :(得分:1)
马克的答案可能是你问题的正确答案。我想补充一点,除此之外,可以检查插件程序集在加载之前是否尝试篡改。
要做到这一点,你应该要求它不会做不安全的代码,不会调用任何本机函数,不做反射等...
.net terrarium project使用这样的检查。在此对等应用程序中,用户提供的.net代码从一个客户端传递到另一个客户端。通过应用长但有限的检查列表,确保交换的代码不会篡改游戏规则(更重要的是)运行游戏的计算机。