Как получить содержание «защищенного» диктата? - PullRequest
0 голосов
/ 26 апреля 2020

Вопрос ко всем Python Мастера. У меня есть переменная box, определенная таким образом:

class BlackBox(dict): 
    def __init__(self, *args, **kwargs):
        super(BlackBox, self).__init__(*args, **kwargs)

    def keys(self):     return None
    def pop(self):      return None
    def __iter__(self): return None

    def items(self):     return None
    def popitem(self):   return None
    def values(self):    return None
    def __repr__(self):  return None
    def __str__(self):   return None

box = BlackBox({'some_secret_key' : 'I am secure content'})

Как получить содержимое box, не зная секретного ключа?

Спасибо.

UPD: python 3.7.4 и выше

Ответы [ 3 ]

2 голосов
/ 26 апреля 2020

Если вам действительно нужно, используйте метод суперкласса. Попробуйте:

print(dict.items(box))
1 голос
/ 26 апреля 2020

Если вы надеетесь создать «безопасную» структуру данных только за python , то вы в конечном итоге будете разочарованы. Предполагая, что вы находитесь в python 2.7 (по тому, как вы назвали super), вот несколько очень простых способов взломать ваш текущий тип.

>>> dict(box)
{'some_secret_key': 'I am secure content'}
>>> box.copy()
{'some_secret_key': 'I am secure content'}
>>> super(type(box), box).items()
[('some_secret_key', 'I am secure content')]
>>> def safe_cracker(**kw): return kw
>>> safe_cracker(**box)
{'some_secret_key': 'I am secure content'}

В python 3 есть меньше способов , но вот несколько способов утечки

>>> box.get("some_secret_key")
'I am secure content'
>>> super(type(box), box).items()
dict_items([('some_secret_key', 'I am secure content')])
>>> box.setdefault("some_secret_key")
'I am secure content'
>>> "some_secret_key" in box
True

(Пока вы наследуете от dict, любой может использовать методы на основе dict для непосредственного опроса структуры, такие как dict.items(box) или super(type(box), box).items())

1 голос
/ 26 апреля 2020

box.copy() получит элементы

Если copy() и другие методы также должны быть переопределены, посмотрите на ответ @ Luv.

...