保护只读字段

时间:2010-11-14 21:53:24

标签: .net

我有这样的代码:

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。

有没有办法防止这种情况?

2 个答案:

答案 0 :(得分:4)

如果您想保护自己免受恶意插件篡改您的应用程序,您应该使用权限有限的自己的AppDomain运行它们,并通过定义良好的界面与插件进行通信。不要直接访问您的程序状态到插件。当然,该插件仍然可以修改您发送的任何数据的副本,但您的数据副本不会受到影响。

答案 1 :(得分:1)

马克的答案可能是你问题的正确答案。我想补充一点,除此之外,可以检查插件程序集在加载之前是否尝试篡改。

要做到这一点,你应该要求它不会做不安全的代码,不会调用任何本机函数,不做反射等...

.net terrarium project使用这样的检查。在此对等应用程序中,用户提供的.net代码从一个客户端传递到另一个客户端。通过应用长但有限的检查列表,确保交换的代码不会篡改游戏规则(更重要的是)运行游戏的计算机。