Python сделать файл скрытым

Сокрытие в Python

Инкапсуляция – это упаковка данных в единый компонент. Сокрытие – это механизм, позволяющий ограничить доступ к данным вне какой-то области. Это немного разные принципы, хотя обычно о них говорят как об одном: мы что-то упаковали в класс, а потом сокрыли от нежелательного доступа из-вне. Можете козырнуть где-нибудь на собеседовании.

Скрывать от доступа из-вне имеет смысл, когда в вашем классе есть данные только для внутреннего использования, и вам нужно защитить от их изменения (будь-то случайного или преднамеренного) из других участков кода.

В Python мы вроде бы доверяем друг другу, и все члены класса по-умолчанию доступны из-вне. Остается лишь соглашение о том, что кто-то их не будет трогать без необходимости.

class PrivateClass: def __init__(self): self.secret_private_data = 5 c = PrivateClass() c.secret_private_data = 10 print(c.secret_private_data)

Никаких вам private/protected.

Ладно, разработчики договорились, что если добавляем подчеркивание перед именем переменной или функции, то она становится как-бы приватной, только для внутренного использования классом. «Как-бы» потому что вы запросто по-прежнему можете менять ее.

class PrivateClass: def __init__(self): self._secret_private_data = 5 c = PrivateClass() c._secret_private_data = 10 print(c._secret_private_data)

Максимум, что вам грозит – недовольство со стороны вашей IDE и коллег на code-review. Давайте добавим два знака подчеркивания перед именем. Будем более убедительными. Может, это немного контр-интуитивно, но этот трюк сработает. Такой атрибут останется видим внутри определения класса, но как-бы «пропадет» из видимости снаружи класса:

class PrivateClass: def __init__(self): self.__secret_private_data = 5 def how_are_you(self): assert self.__secret_private_data == 5 print('OK => ', self.__secret_private_data) c = PrivateClass() c.__secret_private_data = 10 print(c.__secret_private_data) c.how_are_you()

Попытались обмануть, даже что-то там присвоили, но не нанесли урона классу! Но я знаю колдунство посильнее:

class PrivateClass: def __init__(self): self.__secret_private_data = 5 def how_are_you(self): assert self.__secret_private_data == 5 print('OK => ', self.__secret_private_data) c = PrivateClass() c._PrivateClass__secret_private_data = 20 print(c._PrivateClass__secret_private_data) c.how_are_you()

Python не смог окончательно спрятать атрибут.

Работает это так: если имя атрибута начинается с двух подчеркиваний, то Python автоматически переименует его по шаблону _ИмяКласса__ИмяАтрибута. Но! Внутри класса он будет доступен по старому имени: __ИмяАтрибута.

Эта смешная игра в прятки в действительности имеет смысл. От злонамеренного изменения мы не сможем защититься таким образом, а от случайного – да. Вообразим ситуацию с наследованием:

class Base: def __init__(self): self.__x = 5 class Derived(Base): def __init__(self): super().__init__() self.__x = 10 # не поменяет __x из класса Base

В производном классе мы можем и не знать, что в нашем базовом есть переменная с таким же именем, но при совпадении – мы не нарушим работы базового класса, так как внутри это будут переменные с именами _Base__x и _Derived__x.

Тот же эффект будет и с методами, и с переменными на уровне класса (а не экземпляра).

class Foo: __hidden_var = 1 def __hidden_method(self, x): print(x) def __init__(self): self.__hidden_method(self.__hidden_var)

__setattr__

В одном из примеров мы умудрились установить классу атрибут, которого изначально не было в нем. Если такое поведение нежелательно, то можно определить магический метод __setattr__, который будет проверять, какой атрибут мы хотим установить и кидать исключение, если кто-то хочет записать в класс то, что мы не хотим у себя видеть.

class Foo: def __init__(self): self.field1 = 0 def __setattr__(self, attr, value): if attr == 'field1': # можно писать только в field1 self.__dict__[attr] = value else: raise AttributeError f = Foo() f.field1 = 10 # это можно f.field2 = 20 # это нельзя

Но сразу скажу, обычно такую защиту никто не делает. Давайте без фанатизма…

Ограничение экспорта из модулей

Еще один механизм сокрытия – сокрытие сущностей (классов, функций и т. п.) на уровне модулей от бездумного импорта.

Напишем модуль. То есть создаем папку с именем testpack, туда кладем файл __init__.py

Пишем код в __init__.py:

def foo(): print('foo') def bar(): print('bar') __all__ = ['foo']

Далее в другом файле (из основной директории) мы попытаемся импортировать (все – *) из модуля testpack.

from testpack import * foo() bar() # будет ошибка! NameError: name 'bar' is not defined

Имя foo было импортировано, так как мы упомянули его в переменной __all__, а bar – нет. Эта все та же защита от дурака, потому что если мы намеренно импортируем bar – ни ошибок, ни предупреждений не последует.

from testpack import foo, bar foo() bar()

Еще одно замечание: если имя переменной (класса, функции) начинается с подчеркивания, то оно так же не будет импортировано при import *, даже если мы не применяем __all__. И как всегда, вы можете импортировать его вручную.

Источник

скрыть текстовый файл (python tkinter)

Как только приложение запускается, я расшифровываю все сохраненные данные (которые зашифрованы с использованием ARC4) и сохраняю их в файле. Теперь приложение работает в полноэкранном режиме, но если пользователь свернет это окно и заглянет в свой файловый менеджер (nemo, explorer и т. Д.), То он увидит файл в текстовом формате. Это приведет к компрометации всех данных, и, очевидно, я не хочу, чтобы это произошло. Когда приложение закрыто, я шифрую данные и удаляю открытый текст, используя os.remove , и сохраняю только зашифрованные данные. Меня беспокоит то время, когда приложение работает. Сохраненные данные являются информацией об учетной записи (имена пользователей, пароли и т. Д.).

Так есть ли способ как-то скрыть этот текстовый файл, чтобы пользователь не смог увидеть его в своем файловом менеджере, но я могу получить к нему доступ из программы?

препятствие: (

Я не могу изменить весь дизайн программы, потому что я работаю в срок, и это большое приложение, которое просто займет слишком много времени. Пожалуйста, помогите мне с этой проблемой.

характеристики

Я использую Python 2.7 на машине Linux Mint.

3 ответа

действительно , плохая идея хранить конфиденциальные данные в текстовом файле. Вы действительно должны расшифровывать данные только тогда, когда вам это нужно, и использовать их немедленно в программе, не записывая их в файл.

Однако, если вы уже знаете это и просто хотите быстро исправить ошибку, чтобы скрыть файл, вы можете:

  • Начните имя файла с . — например, .data . Это сделает файл скрытым в Unix-системах.
  • Поместите файл в неясное место, которое пользователь вряд ли будет искать, например /tmp
  • Не присваивайте файлу очевидное имя, например passwords.txt , но вместо этого используйте сгенерированное имя из хеш-функции или метки времени, например time.time() . Это будет иметь дополнительное преимущество, так как ваше имя файла будет отличаться при каждом запуске программы.
  • Вы можете удалить разрешения на чтение из файла с помощью os.chmod(file, ‘022’)
  • Удалите файл, когда ваша программа закроется, с os.remove(file)

Есть способы обойти все эти средства защиты (даже удаление файла), они лишь усложняют задачу пользователя по чтению данных. Это вовсе не настоящая защита, и определенно не стоит полагаться на такие методы для защиты реальных данных.

В идеале вы должны расшифровывать данные по мере необходимости, использовать их, а затем удалять из памяти, как только они больше не нужны, даже не записывая их на диск. Если это изменение дизайна слишком велико, и вы не против, если нетехническому пользователю будет немного сложнее получить доступ ко всей вашей конфиденциальной информации, сохраните ее в памяти и примите, что любой, кто заботится о ней, может получить к ней доступ.

В противном случае, некоторые другие варианты для упрощения доступа к данным:

  • Вы можете скрыть файл, но если пользователь включает показ скрытых файлов или использует ls -l , они могут видеть это.
  • Вы можете защитить файл от чтения, но пользователь может изменить разрешения на чтение файла.
  • Вы можете удалить файл сразу после его использования, но пользователь может использовать инструменты восстановления данных, чтобы прочитать файл (или просто прочитать его, пока программа его использует).
  • Вы можете отправить файл на удаленный сервер и прочитать его оттуда без расшифровки данных, когда-либо затрагивающих диск пользователя, но если они используют анализатор пакетов, они могут читать данные.
  • Вы можете хранить его только в памяти, но если ОС выгружает его из памяти или пользователь проверяет память вашей программы, он может прочитать данные.

Несколько более безопасный подход — использовать отображенные в памяти файлы вместо файлов на диске. Если размер зашифрованных данных не равен сотням мегабайт, вы можете создать файлы в памяти, не касаясь диска. Посмотрите на модуль StringIO. Конечно, это не на 100% безопасно, так как есть способы увидеть, что хранится в оперативной памяти, и ОС может перенести данные в файл подкачки на жестком диске, но это все же на порядок лучше «защищено», чем обычное текстовые физические файлы на диске.

Источник

Как редактировать скрытый файл в Windows через Python?

Точно других флагов нет? Поставь себе far и смотри информацию по файлу удобно.

Защиту от записи может сделать флаг — только для чтения, он на столько считается устаревшим (но работающим даже на fat), что многие редакторы при его обнаружении на время сохранения файла его отменяют а потом возвращают, так как для системного администратора это создает больше проблем чем удобства, т.е. его уже не замечают но открыть на запись такой файл не получится

danila763

1) Как через far посмотреть информацию о файле? Через ПКМ -> Свойства открывается стандартное окно
2) В этом и проблема, я для проверки создал пустой файл, поставил флаг скрытый, и файл перестал открываться python-м
3) Изначальная цель — редактировать файл desktop.ini, а у него этот флаг не снимаемый

единственное разумное объяснение — антивирус
файл desktop.ini считается опасным для доступа для редактирования ведь с его помощью можно заставить систему запускать файл без разрешения пользователя — типичный вектор атак для вирусов

попробуй сначала создать файл с другим именем (или переименовать если нужно редактирование) а потом переименовать в desktop.ini

danila763

точно это возникает только со скрытыми файлами?

может причина все же в правах доступа к файлам? файлы в корне системного диска по умолчанию имеют права для всех только на чтение, прошедшим проверку и администраторам — на запись

повышение привилегий в windows делают перезапуском текущего приложения с новыми правами, у меня нет сейчас windows машины с python но гугл говорит что ты правильно все делаешь

p.s. попробуй вручную запусти скрипт с повышением прав (открыв консоль с шифтом или запустив скрипт с помощью runas)

Источник

Читайте также:  Таблицы
Оцените статью