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

Luc*_*key 4 .net c# security reflection

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

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

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

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

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

Jon*_*eet 12

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

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

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

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

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

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

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


Nah*_*hum 6

私人公众等是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 ++这样的低级语言编写代码可能会使代码破解变得非常烦人.但很快,熟练的黑客会为你的程序做任何他想做的事情.

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