由于反射访问私有字段和属性不是安全问题吗?

Isn't accessing private fields and properties due to reflection a security issue?

我最近才发现 here 可以(至少在 c# 中)通过反射查找私有字段和属性。

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

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

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

那么我如何确保我的应用程序安全,这意味着我如何防止除我以外的任何人更改我的 classes 中的基本状态值?

The question now is, if anyone can access every field in my classes, this is kind of insecure, isn't it?

不是每个人都可以。只有具有足够权限的代码——可信代码。不受信任的代码受到相当多的限制。另一方面,如果想要使用反射的人拥有您的程序集,他们可以 运行 在自己的机器上信任代码。不过,这并不是新的攻击向量,就好像他们已经获得了您的代码一样,他们可以 修改它以首先使字段 public 成为可能。

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

So how do I make my Application safe, meaning how do I prevent anyone other than me from changing essential status values inside my classes?

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

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

如果您让用户运行自己编写代码,您需要权衡他们篡改的缺点以及使篡改变得困难的成本。我们无法真正帮助您进行平衡 - 我们不知道您的应用程序是什么,或者涉及的成本是多少(声誉、财务等)。

privatepublic等都是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++ 等低级语言编写代码可能会使破解代码变得非常烦人。但很快熟练的黑客就会对您的程序为所欲为。

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

这本来是对 John Skeets 回答的评论,但 运行 空间不足..

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

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

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

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

抱歉,如果这看起来像评论...

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

只是为了安全不要使用访问修饰符。其他一切都是用户体验。