我最近发现http://jsfiddle.net/e0orb0qq/29/可能(至少在c#中)由于反射而查找私有字段和属性。
我很惊讶,虽然我知道像DataContractSerializer类这样的构造需要访问它们的可能性。
现在的问题是,如果有人可以访问我班级的每个领域,这有点不安全,不是吗?我的意思是如果有人有private bool _isLicensed
字段。它可以很容易地改变!
后来我发现here 字段访问者并不是一种安全机制。
那么如何让我的应用程序安全,这意味着我如何阻止除我之外的任何人更改我的课程中的基本状态值?
答案 0 :(得分:11)
现在的问题是,如果有人可以访问我班级的每个领域,这有点不安全,不是吗?
不是每个人都可以。只有具有足够权限的代码 - 可信代码。不受信任的代码受到相当多的限制。另一方面,如果想要使用反射的人有你的程序集,他们可以在自己的机器上运行可信代码。这不是一个新的攻击媒介,好像他们已经获得了你的代码,他们可以也修改它以使该领域首先公开。
基本上,如果代码在他们的机器上运行,你应该期望它们可以用它做任何事情。不要依赖访问修饰符来保密。
那么如何让我的应用程序安全,这意味着我如何阻止除我之外的任何人更改我的课程中的基本状态值?
如果恶意用户自己运行您的代码,那么您几乎无法做到。你可以让他们更难,但那是一场没有乐趣的军备竞赛。
因此,某些案例中的一个选项是不允许其他人运行您的代码 - 在您已锁定的环境中将其托管在网络上。当然,这在所有情况下都不合适。
如果您让让用户自己运行代码,您需要权衡它们的缺点,篡改使篡改成本变得困难的成本。我们无法真正帮助您实现这种平衡行为 - 我们不知道您的申请是什么,或涉及的成本是什么(声誉,财务等)。
答案 1 :(得分: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 ++这样的低级语言编写代码可能会使代码破解变得非常烦人。但很快,熟练的黑客会为你的程序做任何他想做的事。
唯一可能安全的选择是将您的应用程序作为云服务提供,用户只能看到屏幕输出并发送键盘/鼠标输入。
答案 2 :(得分:1)
这是对John Skeets答案的评论,但是没有空间......
顺便说一句很好的答案,但我还必须补充说,代码并不意味着它的安全意味着明确定义。
大多数开发人员都知道如何更改类并注入类。有许多实用程序不仅可以反编译代码,还允许注入代码。
我不会花费太多精力来尝试使您的代码更安全,我会尝试并期望代码被更改。许多编程语言没有private
,public
,internal
,protected
等修饰符。它们依赖于开发人员了解自己使用此代码的后果。这些编程语言非常成功,因为开发人员明白修改,调用或注入API未指定的代码会产生开发公司无法支持的结果。
因此,期望修改您的代码并确保您的应用程序适当地响应无效更改。
很抱歉,如果这似乎是评论...
答案 3 :(得分:1)
要添加到所有其他答案,一个简单的方法是:如果用户真的想要破坏你的代码,那就让它们吧。你不必支持这种用法。
不要使用访问修饰符来提高安全性。其他一切都是用户体验。