如何创建公共静态类"安全"?

时间:2015-03-09 15:44:21

标签: c# security reflection static-methods

我正在寻找使用公共静态方法为公共类创建一个安全的包装器,所以让我们说这个类非常简单:

public class MyClass {
      public static int Add (int first, int second)
      {
          return first + second;
      }
}

我希望客户端需要通过一些可以调用MyClass的安全其他类来访问它。在一天结束时,我希望将所有这些代码放在一个dll中供客户使用。意图是有一些行为,如:

public class SecureMyClassWrapper
{
    bool _isUnlocked;
    private static readonly List<string> validIds = new List<string>(){"only me", "and them"};

    public SecureMyClassWrapper(string id)
    {
        if (validIds.Contains(id))
        {
            _isUnlocked = true;
        }
        else
        {
            _isUnlocked = false;
        }
    }

    public int Add(int first, int second)
    {
        if (_isUnlocked)
        {
            return MyClass.Add(first, second);
        }
        else
        {
            // throw security exception etc.
        }
    }
}

有一个比我更具黑客攻击能力的人有可能想要使用我的静态方法,所以请有人建议为什么这可能是一个糟糕的方法或者我应该关注的是什么?有些想法是

  • MyClass方法可以通过反射轻松调用
  • 有人可以使用ildasm.exe代码,更改validIds_isUnlocked逻辑列表(甚至是运行时的值?)
  • 可以读取有效的ID,然后将其用作自己的

在这些情况下,我怎样才能防止反射或反编译?您是否建议使用标准方法,例如:代码访问安全性?

3 个答案:

答案 0 :(得分:1)

在另一台计算机上运行服务运行时托管要保护的代码。并使用接口公开api。

答案 1 :(得分:0)

保护 .Net代码的唯一方法是使用Obfuscator。然而它只做了这么多,所以它仍然是可以破解的。即使是非网络代码也很容易破解,通常为了绕过商业软件的电子注册流程而改变堆栈和堆栈等。

如果您正在处理一些非常敏感的代码,您可以随时将其放在云服务器上,但这当然意味着每月的费用。在这种情况下,您可能还需要安全流量(https),这也是同样昂贵的。

最终,在处理代码的安全性时,您必须考虑成本与收益。最好的做法是以一种开源方式编写代码,但不会损害用户的安全性或数据。

答案 2 :(得分:-1)

您应该将MyClass上的函数标记为internal。这意味着只有同一个程序集中的代码才能调用这些方法(即你的&#34;安全&#34;公共方法)

例如:

internal static int Add (int first, int second)
{
    return first + second;
}

看到这个: https://msdn.microsoft.com/en-us/library/7c5ka91b.aspx