代码之家  ›  专栏  ›  技术社区  ›  klm_

保护只读字段

  •  1
  • klm_  · 技术社区  · 14 年前

    我有这样一段代码:

    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();
        }
    }}
    

    在上面的例子中 插件数据 包含 只读字符串ConstString 弦。理论上,传递给IPlugin中Execute方法的PluginData应用于初始化插件。不幸的是 外部插件 可以在外部重写ConstString。

    有什么方法可以防止这种情况发生吗?

    2 回复  |  直到 14 年前
        1
  •  4
  •   Mark Byers    14 年前

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

        2
  •  1
  •   user180326user180326    14 年前

    马克的答案对你的问题来说无疑是正确的。除此之外,在加载插件程序集之前,可以检查插件程序集是否尝试篡改。

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

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

    推荐文章