Как я могу сделать файл полностью неизменным (не удаляемым и доступным только для чтения)? - PullRequest
3 голосов
/ 26 августа 2009

Мне нужно сделать файл действительно доступным только для чтения - чтобы он оставался как есть. Нет удаления, нет ничего.

(установка атрибута 'ReadOnly' не возможна)

Теперь вижу несколько подходов:

  1. Используйте программу, чтобы сохранить файл открытым. Недостаток: можно завершить процесс, а затем файл закроется.

  2. Используйте программу для установки атрибутов безопасности. Недостаток: файл можно удалить. Кроме того, атрибуты могут быть изменены обратно.

Есть идеи? Кроме того, пример кода (желательно в Delphi) будет приветствоваться.

ОБНОВЛЕНИЕ: Спасибо за все ответы до сих пор. Они действительно великолепны. Я понимаю, что мне было не очень ясно. Проблема, которую мы хотим решить, заключается в следующем:

Существует несколько файлов, похожих на .txt, которые содержат конфиденциальную информацию. Наши клиенты хотят быть уверены, что эти файлы не будут изменены «за кулисами» на их компьютерах. Следует отметить, что их компьютеры могут быть легко заражены вредоносным ПО, специально предназначенным для этой цели. Наши клиенты должны иметь возможность открывать эти файлы с помощью Блокнота, Wordpad и т. Д., Но они принимают, что файлы доступны только для чтения. Если кто-либо из наших клиентов предпримет решительное действие, например войдет в «Безопасный режим» и т. Д., И подделает файлы, то это их ответственность. Мы должны защищать их от любого вредоносного ПО, включая атаку нулевого дня. (Следовательно, классическое антивирусное решение не очень подходит).

Можете ли вы дать сейчас некоторые идеи?

PS: Еще раз искренне извиняюсь за то, что не был так ясен с самого начала.

Ответы [ 12 ]

17 голосов
/ 26 августа 2009

Это одно из "что бы произошло, если бы это было правдой?" вопросы. Это не имеет ничего общего с операционной системой, пункты в равной степени относятся к любому компьютеру общего назначения.

Представьте, что есть способ как-то создать неизменный файл.

  • Что мешает кому-то заполнить файловую систему неизменным файлом (или многими из них)?

  • Что если кто-то создаст неизменяемые файлы с путями, которые нужны операционной системе (пример Windows - NTUSER.DAT для какого-то пользователя, * пример nix - / bin / ls и т. Д.)?

  • Что, если операционная система решит, что она должна переместить файл (например, при дефрагментации или иной реорганизации файловой системы)?

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

Я чувствую, что вопрос не полный, как сейчас. Не могли бы вы отредактировать его, чтобы включить более подробную информацию о лежащей в основе проблеме, которую вы пытаетесь решить?

14 голосов
/ 26 августа 2009

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

Этика программирования 101: Если ваша программа будет работать на чужом компьютере, помните, что это их собственность, а не ваша. Это означает, что они имеют право изменять и / или удалять все, что хотят. Попробуйте относиться к системе как к вашей собственности, а они будут относиться к вашей программе как к вредоносному ПО.

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

12 голосов
/ 26 августа 2009

записать компакт-диск.

7 голосов
/ 27 августа 2009

Чтобы убедиться, что эти файлы не изменены "за сценой", можно добавить подпись к файлу.

Чтобы подписать файл, вы можете, например: Создайте строку со всем содержимым файла + секретный пароль и вычислите SHA1-хэш строки. Затем добавьте этот хеш в первую или последнюю строку файла.

Для проверки подписи: Прочитайте файл, удалите строку с хешем, добавьте секретный пароль, пересчитайте хеш и проверьте, совпадает ли он с тем, который содержится в файле.

Для вычисления SHA-1-хэшей в Delphi вы можете, например, использовать MessageDigests .

6 голосов
/ 26 августа 2009

Купите PROM и набор для программирования микроконтроллера и запишите файл в ПЗУ ...

4 голосов
/ 26 августа 2009

Если бы я знал, как это сделать, я бы сообщил об этом Microsoft как об ошибке.

4 голосов
/ 26 августа 2009

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

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

3 голосов
/ 26 августа 2009

Запишите его на носитель с однократной записью.

2 голосов
/ 28 августа 2009

Раймонд Чен из Microsoft недавно написал статью, которая тесно связана: Чтобы запретить людям копировать файлы в папку, нужно использовать безопасность NTFS, а не блокировать перетаскивание . Хотя в этой статье упоминается попытка помешать кому-либо скопировать файл в определенную папку, вы можете использовать представленное решение, чтобы решить вашу проблему здесь.

Чтобы должным образом защитить файл и предотвратить подделку, вы можете настроить ACL для файла так, чтобы он имел разрешения на чтение, но запрещал разрешения на запись, удаление и изменение. Вы можете установить это для конкретного пользователя, группы или даже каждого! Владелец файла будет всегда иметь разрешение на изменение разрешений, поэтому вы не можете постоянно блокировать себя (даже если вы пытаетесь запретить специальный объект CREATOR OWNER). Имейте в виду, что для того, чтобы установить их вручную из диалогового окна безопасности, вам нужно будет войти в область расширенных прав доступа, они не доступны на стандартной странице. Возможно, вы также захотите нарушить наследование, чтобы у файла были только те права доступа, которые вы установили, и ни одного из его родительских прав.

В этом случае было бы лучше использовать опции, которые уже есть, и поэтому вам не придется пытаться взломать систему, чтобы заставить ее работать. NTFS имеет надежную защиту и может выполнять то, что вы хотите, без написания кода. Вы также можете работать с безопасностью напрямую через WINAPI, используя методы, связанные с Защита файлов и Права доступа (MSDN) . Вы можете предоставить разрешения при вызове первого CreateFile или изменить разрешения по факту, используя SetNamedSecurityInfo или SetSecurityInfo .

РЕДАКТИРОВАТЬ: Чтобы решить проблемы, связанные с вредоносными программами, вы даже можете запретить доступ SYSTEM, чтобы даже службы, работающие под системной учетной записью, не могли удалить или записать в нее. Я действительно позаботился об одном противном вирусе в этом методе. он будет продолжать создавать каталог, поэтому я загрузил PE, очистил каталог, а затем запретил всем доступ к нему, включая учетную запись SYSTEM. Вирус не мог распространяться, пока я работал над его удалением.

2 голосов
/ 26 августа 2009

Почему бы вам просто не зашифровать файл и не открыть и не закрыть его вместе с исполняемым файлом? Или поместите это в свою самодельную файловую систему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...