在C#中需要实例化一个类吗?

6
我们需要为安全目的“保护”一个类,使其不具有静态方法。我们不希望新手开发人员按照编码工具的建议将成员变为静态,因为我们需要使用带密码的构造函数来控制对该类的访问。
有没有办法在C#中保护.NET类,以防止它具有任何静态成员?
如果这种功能不可用,那么它是否值得在未来版本的.NET中实现?
谢谢。

10
这似乎是在要求工具为用户负责。为什么不直接培训开发人员如何正确使用API呢? - rossipedia
2
我真的很想听听取消静态方法的理由。你能分享一下吗? - Wesley Long
10
新手开发者与使用密码限制实例化/继承的构造函数的开发者相比?哇,这并不是一个值得拥有的功能。 - meandmycode
5
我想指出,对构造函数进行密码保护在完全信任的情况下是不起作用的,因为反射可以绕过密码保护。我不确定中等信任是否阻止私有反射。如果您确实需要保护类的实现,请将其放在服务后面。 - Michael Stum
4
如果一个类对安全至关重要,新手开发人员首先就没有理由去涉及它。 - millimoose
显示剩余2条评论
8个回答

28

我们需要使用一个带有密码的构造函数来控制对这个类的访问。

听起来像是一个巨大的坏主意,但当然我对你试图解决的安全问题一无所知。这比你的问题更有趣: 你试图保护自己免受什么威胁? 可能有更好的方法来解决它。

有没有办法在C#中保护.NET类以防止具有任何静态��员?

让资深开发人员审核初级开发人员的checkin。无论如何,你都应该这样做,但如果这个类具有某种安全语义,那就更应该这样做。

如果没有这样的功能,未来版本的.NET是否值得实现?

极其不可能。

谢谢。

不客气!


2
@SimpleCoder:我的母亲教我说,当有人感谢我时。 - Eric Lippert
@EricLippert:那我会说你让她感到骄傲了 :) - Chris Laplante
Eric,感谢您的回复。我们想要防止对项目的访问。我们使用强命名验证、混淆和弱但有效的密码要求来实例化。所有保护此类库不被我们调用项目以外的任何东西使用的方法。 - Neal
4
@Neal:“进入项目”不是威胁。假设我告诉你“我想防止别人进入我的房子”。好吧,那是一个合理的想法,但是什么是威胁?“我想防止别人进入我的房子因为我担心有人会偷我的电视”和“我想防止别人进入我的房子因为我担心有人会在地下室放炸弹”是非常不同的。为了缓解这些威胁,你设计安全系统的方式也是不同的。 - Eric Lippert

9
最简单的方法是在您的构建服务器上设置FxCop并编写自定义FxCop规则来检查静态成员。 此问题详细介绍了如何编写自定义FxCop规则。

另外,正如SimpleCoder所指出的那样,您可以使用StyleCop来强制执行源代码上的规则。

此页面描述了如何在msbuild中设置StyleCop。


8
你可以使用StyleCop来执行自定义规则。但是它必须作为构建操作来实现。
此外,您还可以使用FxCop分析二进制文件。

3
你可以在运行时使用反射进行检查,但除此之外,没有语言特性阻止静态成员。我想不出这种功能的好用处。这是沟通问题,而不是实现问题。在你的情况下,你可以将受保护的功能放在一个抽象基类中,在执行任何受保护的函数之前检查用户是否有权限。

添加一个检查静态方法是否存在的静态构造函数很容易编写。 - CodesInChaos

0

我认为一个密封类就足够了,虽然静态成员在原始类声明中是允许的。我认为派生类将不允许进一步的静态成员。


0

我必须承认我从未听说过这样的安全方案。我认为我之所以没有听说它,是因为有很好的理由 - 你确定它能提供你想要的保护吗?

通过要求构造函数包含密码,您试图保护自己免受使用您的类的人的侵害。但是,这些人可以反编译和重新编译您的类以删除密码检查 - 那么您受到了什么保护呢?


0

建议

  1. 培训
  2. 更多的培训
  3. 代码审查
  4. 其他人建议使用stylecop或fxcop - 都是不错的选择
  5. 如果第4点失败了 - 更多的培训 - 这次将其与绩效评估挂钩。 :)

0

我基本上同意Eric Lippert的观点。但在这些情况下,我想要做类似于这样的事情(有时只是为了防止自己犯错),我会尝试为其编写一个单元测试。就像这样:

[Test]
public void Class_should_not_have_static_methods()
{
    var staticMethods = typeof (Foo).GetMethods().Where(x => x.IsStatic);

    Assert.That(staticMethods.Count(), Is.EqualTo(0), "Static methods: " + string.Join(", ", staticMethods.Select(x => x.Name)));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接