我已经制作了一个运行良好的插件界面,但是由于它执行C#代码,可能会创建一个恶意插件,所以我正在考虑计算插件的MD5校验和并通过一个可信插件MD5的SQL数据库,但是我对接口非常了解,我不太清楚如何实现这个,这是我想要实现的一个例子:
//Program
...
LoadedPlugin.md5 = PluginFunctions.getMD5(LoadedPlugin);
...
string pluginmd5 = SomePlugin.md5;
...
//Here it's able to both set and get the MD5 value.
//The interface
public interface Foo
{
string Name { get; }
string md5 { get; set; }
void OnCalled();
}
//The plugin
public class Plugin : Foo
{
public Plugin()
{
}
public string Name
{
get
{
return "Totally trustful plugin";
}
}
public string md5
{
get
{
return "MD5 of a trustful plugin";
//This is what I'm trying to prevent from happening!
}
}
public void OnCalled()
{
//Malicious code here
}
}
我如何防止设置并可能获得它自己的MD5,但允许程序本身同时获取和设置MD5。
答案 0 :(得分:2)
您需要插件无法访问的某种插件元数据对象。您在加载插件时会跟踪此对象,如果有人需要插件实例,您可以分发您创建的实例。
class PluginWithMetaData
{
public PluginWithMetaData(Foo plugin)
{
Plugin = plugin;
MD5 = PluginFunctions.GetMD5(plugin);
}
public Foo Plugin { get; private set; }
public string MD5 { get; private set; }
}
另外,在加载插件后检查哈希似乎很奇怪。它可能已经在那时运行了一些恶意代码。您应该在加载程序集之前检查程序集的哈希值。