Python的可访问的类变量,敏感数据和恶意编码者(黑帽骇客)

10 浏览
0 Comments

Python的可访问的类变量,敏感数据和恶意编码者(黑帽骇客)

我试图使一个变量在我正在进行的项目中无法访问,并且在Does Python have “private” variables in classes?上发现了一个Stack Overflow的帖子。对我来说,这引发了一些有趣的问题,为了使这个问题能够回答,我将用Q1,Q2等标签来标记。我已经找过了,但是我没有找到我提出的问题的答案,特别是关于敏感数据的问题。\n我在那篇帖子中找到了一些有用的东西,但是似乎普遍的共识是,如果你看到一个以_开头的变量,就像一个成年人一样,意识到你不应该去碰它。对于以__开头的变量,也提出了类似的想法。在那里,我大致的想法是你要相信人们不会使用像这里描述的和这里(更详细地)描述的技巧。我还在这个Stack Overflow帖子上找到了一些好的信息。\n当你谈论良好的编程实践时,这都是非常好的建议。\n我在我分享的帖子的评论中发表了一些想法。我的主要问题在这里发表为评论。\n

\n我对于那些想引入恶意代码的人没有更多的讨论感到惊讶。这是一个真实的问题:在Python中是否没有办法阻止黑客访问你的变量和方法,并插入可能会拒绝服务、泄露个人(或专有公司)信息的代码/数据Q1如果Python不允许这种类型的安全性,是否应该在处理敏感数据时使用它Q2?\n

\n我是不是完全误解了什么:恶意编码者甚至可以访问变量和方法来插入可能会拒绝服务或泄露敏感数据的代码/数据Q3?\n我可以误解了某个概念,错过了某些东西,把问题放在了不应该放置的位置,或者对计算机安全一无所知。然而,我想要理解这里发生了什么。如果我完全误解了,我希望得到一个告诉我这一点的答案,但我也想知道我完全误解了什么以及如何重新回到正确的轨道上。\n我在这里提问的另一个问题来自于我在那些帖子/答案上发表的另一个评论。@SLott (有点改述):\n

\n...我发现privateprotected是非常非常重要的设计概念。但作为实际问题,在几万行的Java和Python代码中,我从来没有真正使用过privateprotected。...这是我的问题:“受谁保护?”\n

\n为了找出我的担忧是否值得关注,我在那篇帖子上发表了评论。这是编辑过的评论。\n

\nQ:“受谁保护?”A:“受恶意的黑客保护,他们希望访问变量和函数以便能够拒绝服务、访问敏感信息...”看起来A._no_touch = 5的方法会让这样一个恶意编码者嘲笑我的“请不要碰这个”。我的A.__get_SSN(self)似乎只是希望B.H.(黑帽)不知道这个x = A(); x._A__get_SSN()的技巧(由@Zorf提供的技巧)。\n

\n我可能是把问题放在了错误的地方,如果是这样的话,我希望有人告诉我我把问题放在了错误的地方,但也要解释。有没有办法用基于类的方法来保护数据安全Q4?在处理Python中的敏感数据时,还有哪些非类和变量的解决方案Q5?\n下面是一些代码,展示了为什么我认为这些问题的答案是一个让人怀疑Python是否应该用于敏感数据Q2的原因。这不是完整的代码(我为什么会将这些私有值和方法放在没有在任何地方使用它们的地方?),但我希望它能展示出我想要询问的类型。我在Python交互式控制台上键入并运行了所有这些代码。\n

## 将以下代码输入解释器以定义类。
class A():
  def __init__(self):
    self.name = "好人"
    self.just_a_4 = 4
    self.my_number = 4
    self._this_needs_to_be_pi = 3.14
    self.__SSN = "我希望你不要黑掉这个..."
    self.__bank_acct_num = 123
  def get_info():
    print("姓名、社会安全号码、银行账号。")
  def change_my_number(self, another_num):
    self.my_number = another_num
  def _get_more_info(self):
    print("地址、健康问题。")
  def send_private_info(self):
    print(self.name, self.__SSN, self.__bank_acct_num)
  def __give_20_bucks_to(self, ssn):
    self.__SSN += " 有20美元"
  def say_my_name(self):
    print("我的名字")
  def say_my_real_name(self):
    print(self.name)
  def __say_my_bank(self):
    print(str(self.__bank_acct_num))

\n

>>> my_a = A()
>>> my_a._this_needs_to_be_pi
3.14
>>> my_a._this_needs_to_be_pi=4 # 我忽视了以`_`开头的规则。
>>> my_a._this_needs_to_be_pi
4
## 这个下一个方法实际上可以设置一种安全连接,
## 我猜,它可以发送私有数据。我只是在这里打印它。
>>> my_a.send_private_info()
好人。我希望你不要黑掉这个... 123
## 轻松访问和更改“私有”变量
>>> my_a.__SSN
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: 'A' object has no attribute '__SSN'
>>> my_a.__dict__
{'name': '好人', 'just_a_4': 4, 'my_number': 4, '_this_needs_to_be_pi': 4, 
'_A__SSN': '我希望你不要黑掉这个...', '_A__bank_acct_num': 123}
>>> my_a._A__SSN
'我希望你不要黑掉这个...'
#(也许)潜在的更危险
>>> def give_me_your_money(self, bank_num):
      print("我不知道如何注入代码,但是我可以")
      print("访问你的银行账号:")
      print(my_a._A__bank_acct_num)
      print("并使用我的银行账号:")
      print(bank_num)
>>> give_me_your_money(my_a,345)
我不知道如何注入代码,但是我可以
访问你的银行账号:
123
并使用我的银行账号:
345

\n在这一点上,我重新输入了类定义,这可能是不必要的。\n

>>> this_a = A()
>>> this_a.__give_20_bucks_to('unnecessary param')
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: 'A' object has no attribute '__give_20_bucks_to'
>>> this_a._A__give_20_bucks_to('unnecessary param')
>>> this_a._A__SSN
'我希望你不要黑掉这个... 有20美元'
## 添加一个假的“私有”变量,`this_a.__SSN`
>>> this_a.__SSN = "B.H.的社会安全号码"
>>> this_a.__dict__
{'name': '好人', 'just_a_4': 4, 'my_number': 4, '_this_needs_to_be_pi': 3.14, 
'_A__SSN': '我希望你不要黑掉这个... 有20美元', '_A__bank_acct_num': 123, 
'__SSN': "B.H.'s SSN"}
>>> this_a.__SSN
"B.H.'s SSN"
## 现在,更改真实的那个并“发送/窃取钱”
>>> this_a._A__SSN = "B.H.'s SSN"
>>> this_a._A__give_20_bucks_to('unnecessary param')
>>> this_a._A__SSN
"B.H.'s SSN has $20"

\n我以前在一家与敏感数据有关的承包工作中做过一些工作-不是社会安全号码和银行账号,而是一些人的年龄、地址、电话号码、个人历史、婚姻和其他关系历史、犯罪记录等等。我没有参与保护这些数据的编程工作;我帮助进行了有关机器学习准备的数据真实性验证,以提取有用的信息。我们有权限和法律许可来处理这样的数据。另一个主要问题是:在Python中,如何收集、管理、分析和得出有用结论的敏感数据Q6?从我在这里讨论的情况来看,似乎类(或任何其他数据结构,我在这里没有详细介绍,但似乎存在相同的问题)无法以安全(私有或受保护的方式)进行操作。我想象一个基于类的解决方案可能与编译有关。这是真的吗Q7?\n最后,因为我来到这里不是为了安全性,而是为了代码可靠性,所以我会发布另一个我发现的帖子和我发表的评论,以完成我的问题。\n@Marcin 发表了以下内容,\n

\n[回应OP的话]“问题很简单。我希望只有类内部才能访问和更改私有变量。” [Marcin回答]所以,在类外部不要编写访问以__开头的变量的代码。使用pylint或类似的工具来捕捉这种样式错误。\n

\n我在我接下来的回复评论中的目标是看看我的想法是否代表了实际的编码关注。我希望它没有显得无礼\n

\n如果你只是为了个人乐趣而编写代码,从不需要将其交给其他人来维护,那么这个答案可能很好。但是,任何时候在协作编码环境中(任何高等教育和/或工作经验),代码将被许多人使用。迟早有人会想要使用一种简便的方法来更改你的__你真的不应该碰这个变量。他们可能有充分的理由这样做,但是可能你设置了你的代码,使得他们的“简便方式”会破坏事情。\n

\n我的观点正确吗,还是大多数程序员尊重双下划线Q8有没有比__策略更好的方法来保护代码的完整性,使用PythonQ9

0
0 Comments

Python的可访问类变量、敏感数据和恶意代码(黑客)出现的原因是对代码的逻辑封装的需求。通过将代码标记为protected或private,可以确保实现类的逻辑封装。这意味着除了实现类自身,其他代码不应直接访问这些变量,因为其他代码可能无法正确使用它们并可能破坏状态。

在编译成字节码并在运行时存储在内存中之后,所有这些都会变成一大堆字节。在应用程序范围内,没有保护各个内存偏移量的方式,它们只是一堆字节。protected和private是程序员对自己的代码施加的约束,以保持自己的逻辑清晰。对于这个目的,使用下划线等更或多或少非正式的约定是完全足够的。

攻击者无法在单个属性的级别上进行攻击。对于他们来说,运行的软件是一个黑匣子,内部发生的任何事情都无关紧要。如果攻击者实际上能够访问单个内存偏移量,或者实际上能够注入代码,那么无论如何游戏结束。在这一点上,protected和private并不重要。

许多程序员可能有同样的误解;使用实际的protected关键字的语言通常会在尝试访问标记为protected的属性时抛出错误。这可能会强制执行无法访问它们的概念。(实际上,你总是可以访问它们,只是你必须非常明确地这样做。)从这个意义上说,我喜欢Python的方法;它甚至不假装这些属性是不可访问的,它只是希望你在访问它们时要成熟一些。

这样完美地涵盖了我从人们的评论中学到的所有东西。我是一个学习编码以进行研究的物理学家,喜欢编码,并成为一名开发人员和研究人员。这使得我遇到了我的教育中没有的这些基本概念。我不确定我是从哪里得到的这个想法,即private、protected和下划线是计算机安全的一部分(也许是因为protected这个词),但是你的回答非常简洁地填补了我知识的空白。谢谢。

0