C# Isn';是否由于安全问题而无法访问私有字段和属性?

C# Isn';是否由于安全问题而无法访问私有字段和属性?,c#,.net,security,reflection,C#,.net,Security,Reflection,我最近才发现,由于反射,可以(至少在c#中)查找私有字段和属性 我很惊讶,尽管我知道像DataContractSerializer类这样的构造需要能够访问它们 现在的问题是,如果有人可以访问我的类中的每个字段,这有点不安全,不是吗?我的意思是,如果某人有一个私有bool\u isLicensed字段,该怎么办。它可以很容易地改变 后来我发现字段访问器并不是一种安全机制 那么,如何使我的应用程序安全,也就是说,如何防止除我以外的任何人在我的类中更改基本状态值 现在的问题是,如果有人可以访问我的类中

我最近才发现,由于反射,可以(至少在c#中)查找私有字段和属性

我很惊讶,尽管我知道像DataContractSerializer类这样的构造需要能够访问它们

现在的问题是,如果有人可以访问我的类中的每个字段,这有点不安全,不是吗?我的意思是,如果某人有一个
私有bool\u isLicensed
字段,该怎么办。它可以很容易地改变

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

那么,如何使我的应用程序安全,也就是说,如何防止除我以外的任何人在我的类中更改基本状态值

现在的问题是,如果有人可以访问我的类中的每个字段,这有点不安全,不是吗

不是每个人都可以。仅具有足够权限的代码-受信任的代码。不受信任的代码受到了很大的限制。另一方面,如果想要使用反射的人拥有您的程序集,他们可以在自己的机器上运行受信任的代码。这不是一个新的攻击向量,虽然他们已经有了你的代码,他们也可以修改它使现场公开。 基本上,如果代码在他们的机器上运行,您应该期望他们能够用它做几乎任何事情。不要依赖访问修饰符来保守任何秘密

那么,如何使我的应用程序安全,也就是说,如何防止除我以外的任何人在我的类中更改基本状态值

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

因此,在某些情况下,一种选择是不让其他人运行您的代码——在您锁定的环境中在web上托管代码。当然,这并不适用于所有情况


如果您必须让用户自己运行代码,那么您需要权衡他们篡改代码的负面影响和使篡改变得困难的成本。我们无法真正帮助您实现这一平衡-我们不知道您的应用程序是什么,也不知道所涉及的成本是什么(声誉、财务等)。

公私等都是其中的一部分。其用途是使您的API清晰明了并避免错误

没有可靠的方法可以避免人们干扰你的程序。 您可能已经注意到,所有程序通常在几天内就被破解了

在.net中,这是非常容易的,因为IL代码非常可读,这允许您获取任何DLL并像C#代码一样读取它

使用模糊器阅读代码会让人更讨厌

但是像这样的应用程序 很容易打破这个

SecureString是一个很好的技巧:

用C++编写低级别语言的代码可能会使代码变得烦人。但是很快,一个熟练的黑客会对你的程序做任何他想做的事情


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

这本来是对John Skeets answer的评论,但空间不足

顺便说一句,答案很好,但我还必须补充一点,代码并不意味着安全,而是意味着定义清晰

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

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

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


抱歉,如果这看起来像是一条评论…

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


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

没有什么是安全的。例如,如果你有一个调试器,你几乎可以做任何你想做的事情:-DPublic/private是为了防止事故,而不是欺诈。谢谢,这帮了大忙。我知道不会有具体的答案。我会接受你的:)你得到了我的+1作为迷因;)