由于反射访问私有字段和属性不是安全问题吗?
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 回答的评论,但 运行 空间不足..
顺便说一句,很好的答案,但我还必须补充一点,代码并不意味着安全,它意味着明确定义。
大多数开发人员都知道如何更改 类 并注入 类。有许多实用程序不仅可以反编译您的代码,还可以注入代码。
我不会花太多精力尝试让您的代码更安全,我会尝试并期望代码被更改。许多编程语言没有private
、public
、internal
、protected
等修饰符,它们依赖于开发人员自己理解使用此代码的后果.这些编程语言非常成功,因为开发人员明白修改、调用或注入 API 未指定的代码会产生开发公司无法也不会支持的结果。
因此,请期待您的代码被修改并确保您的应用程序适当地响应无效更改。
抱歉,如果这看起来像评论...
要添加所有其他答案,一种简单的查看方式是:如果用户真的想要破坏您的代码,那就让他们来吧。您不必支持该用法。
只是为了安全不要使用访问修饰符。其他一切都是用户体验。
我最近才发现 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 回答的评论,但 运行 空间不足..
顺便说一句,很好的答案,但我还必须补充一点,代码并不意味着安全,它意味着明确定义。
大多数开发人员都知道如何更改 类 并注入 类。有许多实用程序不仅可以反编译您的代码,还可以注入代码。
我不会花太多精力尝试让您的代码更安全,我会尝试并期望代码被更改。许多编程语言没有private
、public
、internal
、protected
等修饰符,它们依赖于开发人员自己理解使用此代码的后果.这些编程语言非常成功,因为开发人员明白修改、调用或注入 API 未指定的代码会产生开发公司无法也不会支持的结果。
因此,请期待您的代码被修改并确保您的应用程序适当地响应无效更改。
抱歉,如果这看起来像评论...
要添加所有其他答案,一种简单的查看方式是:如果用户真的想要破坏您的代码,那就让他们来吧。您不必支持该用法。
只是为了安全不要使用访问修饰符。其他一切都是用户体验。