Как предотвратить изменение внешнего XML-файла? - PullRequest
0 голосов
/ 25 августа 2010

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

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

Ответы [ 5 ]

2 голосов
/ 25 августа 2010

В нем можно хранить больше информации, например, хэш контента (конечно, до того, как хэш был вставлен).

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

1 голос
/ 25 августа 2010

Добавляет хеш файла, соединенного с секретным ключом, в конец файла. Как XML-комментарий

<!-- 0123456789abcdefabcdef0123456789 -->

После открытия файла вы снова хешируете его с добавленным секретным ключом и проверяете его.

Псевдо-код для уточнения.

# Read
secret  = "Secret key"
file    = get_file_contents("file.xml")
content = strip_trailing_comment(file)
hash    = get_content_hash(file)
if sha1(content + secret) == hash:
    # File is valid

# Write
secret            = "Secret key"
content           = content_to_xml()
hash              = sha1(content + secret)
content_with_hash = append_comment(hash)
write_to_file("file.xml", content_with_hash)

Надежда, которая проясняет потенциальные недоразумения. Таким образом, код по-прежнему читабелен для человека, если вы этого хотите, и трудно подделать.

1 голос
/ 25 августа 2010

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

Обычно это невозможно.В конце я объясню.

У вас есть несколько вариантов действий:

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

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

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

Единственная возможность - запустить программу с большими правами, чем у пользователя, и хранить данные в месте, где у пользователя тоже нет доступа.Например, в Windows вы можете запустить его как сервис.Это требует от пользователя не иметь прав администратора (или пользователя root в системах Unix).

Если пользователь является администратором или пользователем root, вы проиграли, поскольку у него есть полный доступ к системе, а вы не можетескрывать.(в Windows есть еще один уровень - пользователь SYSTEM, но пользователь с правами администратора также может легко получить эти права).

1 голос
/ 25 августа 2010

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

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

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

0 голосов
/ 25 августа 2010

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

В этом случае вам придется проделать дополнительную работу:

  • Создать xml-файл с хэш-информацией, как предлагает Колин ХЕБЕРТ
  • Заархивировать файл с паролемзащита, пароль, к которому будет знать только ваше приложение

Существует вопрос относительно stackoverflow о том, как защитить паролем ваш zip-файл

При таком подходеобратите внимание, что xml-файл даже не становится читаемым.

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

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