由于反映安全问题,是否访问私有字段和属性?

我刚刚在这里发现,由于reflection,可以(至少在c#中)查找私有字段和属性。

我很惊讶,虽然我知道像DataContractSerializer类这样的构造需要访问它们的可能性。

现在的问题是,如果任何人都可以访问我class级的每个领域,这有点不安全,不是吗? 我的意思是如果有人有private bool _isLicensed字段。 它可以很容易地改变!

后来我在这里发现, 字段访问器并不是一种安全机制。

那么如何让我的应用程序安全,这意味着我如何阻止除我以外的任何人改变我的类中的基本状态值?

现在的问题是,如果任何人都可以访问我class级的每个领域,这有点不安全,不是吗?

不是每个人都能。 只有具有足够权限的代码 – 可信代码。 不受信任的代码受到很大限制。 另一方面,如果想要使用reflection的人拥有你的程序集,他们可以在自己的机器上运行可信代码。 这不是一个新的攻击媒介,好像他们已经得到你的代码,他们也可以修改它,使该领域首先公开。

基本上,如果代码在他们的机器上运行,你应该期望它们可以用它做任何事情。 不要依赖访问修饰符来保密。

那么如何让我的应用程序安全,这意味着我如何阻止除我以外的任何人改变我的类中的基本状态值?

如果敌对用户自己运行您的代码,那么您几乎不能。 你可以让他们更难,但这是一场没有乐趣的军备竞赛。

因此,在某些情况下,一个选项是不让任何其他人运行您的代码 – 在您已锁定的环境中将其托管在Web上。 当然,这并非适用于所有情况。

如果你必须让用户自己运行代码,你需要权衡它们的缺点,篡改使篡改困难的成本。 我们无法真正帮助您实现这种平衡行为 – 我们不知道您的应用程序是什么,或者涉及的成本是什么(声誉,财务等)。

私人公众等是http://en.wikipedia.org/wiki/Encapsulation的一部分。 用途是使您的API清晰并避免错误。

没有可靠的方法来避免人们搞乱你的程序。 您可能已经注意到所有程序通常都会在几天内破解。

在.net中它非常简单,因为IL代码非常易读http://ilspy.net/这样可以让你接受任何DLL,只需像C#代码一样阅读它。

你可以使用混淆器来阅读你的代码更烦人http://en.wikipedia.org/wiki/List_of_obfuscators_for_.NET

但像http://de4dot.com/这样的应用程序很容易打破这个。

SecureString是一个很好的技巧: https : //msdn.microsoft.com/en-us/library/system.security.securestring%28v=vs.110%29.aspx

用c ++这样的低级语言编写代码可能会使代码破解变得非常烦人。 但很快,熟练的黑客会为你的程序做任何他想做的事情。

唯一可能安全的选择是将您的应用程序作为云服务提供,用户只能看到屏幕输出并发送键盘/鼠标输入。

这本来是对John Skeets答案的评论,但是用完了……

顺便说一句很好的答案,但我还必须补充说,代码并不意味着它的安全意味着明确定义。

大多数开发人员都知道如何更改类并注入类。 有许多实用程序不仅可以反编译代码,还可以注入代码。

我不会花费太多努力来尝试使您的代码更安全,我会尝试并期望代码被更改。 许多编程语言都没有privatepublicinternalprotected等修饰符。它们依赖开发人员来理解自己使用这些代码的后果。 这些编程语言非常成功,因为开发人员明白修改,调用或注入API未指定的代码会产生开发公司无法支持的结果。

因此,期望修改您的代码并确保您的应用程序适当地响应无效更改。

对不起,如果这看似评论……

要添加到所有其他答案,一个简单的方法是:如果用户真的想要破坏你的代码,那就让它们吧。 您不必支持该用法。

只是不要使用访问修饰符来提高安全性。 其他一切都是用户体验。