c# - 由于反射访问私有(private)字段和属性不是安全问题吗?

标签 c# .net security reflection

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

我很惊讶,尽管我知道像 DataContractSerializer 类这样的构造需要以某种方式访问​​它们。

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

后来才知道here 字段访问器并不是一种安全机制。

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

最佳答案

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

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

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

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 上。当然,这并不适用于所有情况。

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

关于c# - 由于反射访问私有(private)字段和属性不是安全问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30191282/

相关文章:

c# - 当需要该类 WPF 的多个实例时,模型内部的 INotifyPropertyChanged

.net - 列表框在自动回发时滚动到顶部

c - 无法写入堆栈(堆栈溢出)

asp.net-mvc - 如何保护用户上传的文件

linux - 从 nmcli linux shell 脚本获取信息

用于处理不返回的非 void 方法的 C# 选项

c# - 使用 XSD 架构验证 XML,而无需使用 C# 更改 XML

c# - XML序列化——序列化用户控件中的属性

c# - 无法将类型从 string 更改为 int?

c# - 无法使用 ValuePattern,即使它受支持