【问题标题】:how to prevent external xml file modification?如何防止外部xml文件被修改?
【发布时间】:2010-08-24 21:13:40
【问题描述】:

我正在编写一个小库,它将处理 xml 文件以存储一些数据,并且我需要仅通过我在库中提供的方法来处理这些数据。

我知道 xml 对人和机器都是可读的,如果有人真的想修改 xml 文件,他可能会这样做,所以......你们有没有一个可行的想法?

【问题讨论】:

  • 将文件设为只读? chmod 444?
  • 我在想一些对用户来说更难破解的东西

标签: java xml security file-io


【解决方案1】:

您可以在其中存储更多信息,例如内容的哈希(当然是在插入哈希之前)。

当您重新加载此文件时,您可以检查哈希。如果它与您文件的当前哈希不匹配,那么它已被修改。

【讨论】:

  • 是的,我已经实现了这个,但它不会“阻止”文件修改,谢谢。
【解决方案2】:

嗯,没有明确的方法来阻止对该文件的访问。但是您可以使用多种措施来使手动覆盖文件变得困难。

只要您的应用程序正在运行,您可以做的第一件事就是锁定文件(需要确保操作系统兼容性)。任何人都可以绕过操作系统文件锁定,但对于普通用户来说并非易事。

其次,您可以考虑在应用程序终止时加密文件。可以通过应用程序代码检查来恢复密钥,但同样需要付出巨大的努力。

【讨论】:

  • 我喜欢这个主意,也许文件可以从一开始就被加密。还有其他建议吗?
【解决方案3】:

如上所述,您已经实现了一种检测文件更改的方法,并且您想要一种方法来防止这些修改。

通常,这是不可能的。我会在最后解释。

你有几种选择:

  • 如果您想在程序运行时防止修改,您可以锁定文件。这将阻止应用程序访问它,但是当您的程序退出时,锁将被释放。 (Example)
  • 如果您想在程序未运行时阻止访问,您必须更改文件系统权限以禁止用户编辑文件。这要困难得多,因为它与文件系统相关,并且某些文件系统(如 FAT)根本没有文件权限。
  • 您可以编写一个“守护程序”脚本来监视文件更改并恢复它们。

但是所有这些可能性都有一个问题 - 程序通常与用户具有相同的权限,因此程序所做的一切都可以由用户撤消。如果你的程序有访问权限,那么用户也有。

如果您锁定了一个文件,用户可以使用 Unlocker 之类的工具来释放锁定,然后进行编辑。如果您的程序设置了文件权限,用户可以简单地将它们改回来。在某些系统上,可能可以防止这种情况发生,但是您的程序也会失去访问权限。坏的。如果你写一个守护进程,用户可以杀死它。

唯一的可能是让程序以比用户更多的权限运行,并将数据存储在用户也无权访问的地方。例如,在 Windows 上,您可以将其作为服务运行。这要求用户没有管理员权限(或 root,在 Unix 系统上)。

如果用户是 admin 或 root,那么您就输了,因为他拥有系统的完全访问权限,您无法隐藏。 (在 Windows 上,还有一个级别,即 SYSTEM 用户,但管理员用户也可以轻松获得这些权限。

【讨论】:

  • 是的,你是对的,也许我应该将我的问题改为“如何让用户更难阅读文件?”
【解决方案4】:

将文件的哈希与密钥连接到文件末尾。类似于 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)

希望能消除潜在的误解。这样,如果您愿意,代码仍然是人类可读的,并且难以篡改。

【讨论】:

    【解决方案5】:

    据我从讨论和您的问题中了解到,您希望将数据存储为 xml,并且用户难以打开/修改它。

    在这种情况下,您将不得不做一些额外的工作:

    • 按照 Colin HEBERT 的建议使用哈希信息创建 xml 文件
    • 使用密码保护压缩文件,该密码只有您的应用知道

    有一个question on stackoverflow 告诉你如何用密码保护你的 zip 文件

    请注意,在这种方法中,xml 文件甚至无法读取。

    如果您希望文件可读,那么您可以为您的应用程序使用单独的用户 ID(unix 用户 ID 或 Windows 用户 ID)作为文件的所有者。并且只允许该用户修改文件,但这仍然不是 100% 的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      相关资源
      最近更新 更多