可变隐私实际上与安全性有啥关系,还是只是为了编程方便?

Posted

技术标签:

【中文标题】可变隐私实际上与安全性有啥关系,还是只是为了编程方便?【英文标题】:Does variable privacy actually have anything to do with security or is it just for programming convenience?可变隐私实际上与安全性有什么关系,还是只是为了编程方便? 【发布时间】:2012-02-02 07:30:39 【问题描述】:

多年来我一直在编程,我想我什至了解大部分情况下公共、私有和受保护之间的区别,但是这些名称是否只是误导?这些可见度水平是否只是为了帮助我们不绊倒自己的脚趾?我编写的许多语言似乎都没有强制执行这些规则中的大多数,而且我从未听说过黑客闯入系统,因为您的变量之一没有标记为私有。

我很想知道这件事困扰了我很多年。

【问题讨论】:

【参考方案1】:

如果黑客能够正确计算内存偏移量,他们就可以访问私有变量。不太难。

这些访问控制涵盖更广泛且通常不同类别的错误。更好的封装简化了代码并使其更容易推理,从而为发现其他安全问题的错误扫清了道路。 (也就是说,它间接有助于安全。)

故意难以破解的代码也可能更难被意外破解:-)

【讨论】:

所以当我声明事物不变、受保护和私有时,我只是为了更容易发现错误?似乎我给自己额外的工作和这些变量的选择更少。如果可以的话,我通常会把这些东西放在一边,然后尽可能快地一次调试一个错误。我只是不知道这些话对我有什么帮助。说真的,我多年来一直在思考这个问题,问人们,现在终于在这里问了。我想不通。 是的,使用 const/private 的选项更少。这是好事。出错的事情更少,调试时要考虑的事情也更少。如果您可以将错误归因于私有状态的突变,那么您可以大量减少搜索空间。除非必须,否则将其设为私有/常量。 也许您应该在声明式/函数式语言上投入一些时间。你不会以同样的态度或风格回到 C++,我保证。 @user1029030:这是边缘 IMO。使用没有这些访问限制的 Python 编程,我很少花时间修复错误,因为我修改了不应该修改的内容,或者访问了不应该访问的字段。不是从来没有,但很少,而且我认为所有这些注释是否在编程时节省时间是一个近距离的事情。但是,当您在团队中工作或几年后返回自己的代码并且必须尝试记住哪些对象预计不会被修改时,它们通常会在尝试理解代码时节省时间。 @Andy:根据我的经验不是。它很有用,实际上是因为像“const”和“private”这样的注释是编译器检查为真的文档,因此比仅仅声明的要求“不要修改这个”或其他任何东西给你更多的信心。但是 Python 缺少对大型编程几乎至关重要的元素是不可能的,因为它已经成功地在大型中大量使用。我喜欢这种静态检查,并在可用时使用它们,但这并不能使它们变得重要。我使 Python 中的类型错误方式多于封装错误。【参考方案2】:

访问说明符是一种对源代码进行排序的方法,而不是一种安全功能。

由于类的成员变量是在您自己的代码中定义的,因此可以通过多种方式(指针、宏)访问它们,而不管访问说明符如何。

【讨论】:

是的,这是让我一直困惑的其他事情之一。如果我自己编写所有这些代码,为什么我还要费心保护自己的安全?我一直使用作用域来保持变量不变。 “为什么要保护自己的东西?” Experts don't trust themselves.【参考方案3】:

如果您创建一个库供其他人使用,您希望公开一个 API 并隐藏其他所有内容。您不希望到处都有未记录的“功能”。这些可能会导致各种错误,而这些错误又会造成安全漏洞。

即使代码不是为其他人编写的,也很容易忘记并通过不按预期顺序分配某些内容来绊倒自己,或者认为变量意味着一件事而实际上是另一件事。

所以简短的回答是,它只是一种编程便利,但这些编程便利可以帮助您创建更健壮、更安全的代码。

【讨论】:

我可以看到你的目标,但如果这是一个编译或托管的 API 而不是代码库,那么你应该能够清理所有传入的数据以确保它不是运行任意代码对吗?如果它是一个库,那么他们可以随意修改它,所以那里没有太多的安全性...... 这里有两种不同类型的“安全”。如果它是已编译或托管的 API(非开源),那么您希望保持代码本身的安全。然后是所有级别的应用程序用户的安全性,这会影响所有库/API/托管代码/任何东西。在这种情况下,如果有人使用您的库并对其进行编辑以损害安全性,那是他们的错。作为原始库(编译或其他方式)开发人员,您的工作是确保它尽可能地遵循开箱即用的良好实践。

以上是关于可变隐私实际上与安全性有啥关系,还是只是为了编程方便?的主要内容,如果未能解决你的问题,请参考以下文章

可以以编程方式重置位置和隐私设置吗?

差分隐私?联邦学习?安全多方计算?它们之间是什么关系?

c 编程中的 * 和 & 运算符有啥区别?

观察者模式和反应式编程有啥区别?

cesium 和 Three.js有啥区别,以及二者与WebGL 的关系

URL与IP地址有啥关系与区别