如何限制从python访问文件

如何限制从python访问文件,python,Python,因此,我制作了一个python电话簿程序,允许用户添加联系人、更改联系人信息、删除联系人等,并将这些数据写入一个文本文件,我可以在每次再次打开该程序时读取这些数据,并获取现有的联系人数据。然而,在我的程序中,我以一种非常特定的方式写入文本文件,因此我知道格式是什么,并且可以将其设置为非常容易读取。因为它都是以一种非常特定的方式格式化的,所以我想防止用户打开文件,甚至仅仅用一个简单的空间就不小心弄乱了数据。我怎样才能做到这一点呢?我认为对你来说最好的办法就是为你的格式选择一个新的文件扩展名 它显然

因此,我制作了一个python电话簿程序,允许用户添加联系人、更改联系人信息、删除联系人等,并将这些数据写入一个文本文件,我可以在每次再次打开该程序时读取这些数据,并获取现有的联系人数据。然而,在我的程序中,我以一种非常特定的方式写入文本文件,因此我知道格式是什么,并且可以将其设置为非常容易读取。因为它都是以一种非常特定的方式格式化的,所以我想防止用户打开文件,甚至仅仅用一个简单的空间就不小心弄乱了数据。我怎样才能做到这一点呢?

我认为对你来说最好的办法就是为你的格式选择一个新的文件扩展名

它显然不阻止编辑,但它清楚地向用户说明它有一些特定的格式,可能不应该手动编辑。默认情况下,GUI可能不会打开它(它会询问用什么编辑它)

如果你担心的是用户弄乱了他们自己的数据,我能想象的任何情况下,这都足够了。我认为,如果用户主动试图弄乱他们的数据,你就无法获胜。我也怀疑任何程序能做更多的事情。通常的“契约”是,用户的数据是用户的,所以它可以被用户销毁

例如,如果您确实不想阻止编辑,您可以更改权限以禁止使用os.chmod进行编辑。用户仍然可以手动提起它们,并且在您实际写作时会有一个时间窗口,所以它既不干净,也不明显更有效。我认为这样一个解决方案带来的麻烦要多于好处


如果您想让用户无法读取/编辑文件,您可以从其他用户处运行您的进程(或使用一些更重的机制,如SELinux或其他MAC机制),这样您就可以使数据真正不可能损坏(具有用户权限)。但是,如果只是为了保护用户不受粗心带来的灾难性影响,那么就不值得这么做。

很难完全阻止用户访问您的数据存储。但是,您可以让用户更难访问您的数据,也可以让用户更容易不破坏数据。在第二种情况下,您的意图是向用户明确规则是什么,希望不破坏数据符合用户自身的最佳利益。一些例子:

  • 使用完善的、人类可读的序列化格式,例如JSON。这通常是最好的解决方案,因为它实际上允许有经验的用户轻松地检查数据,甚至修改数据。没有经验的用户无论如何都不太可能弄乱数据,知道格式的有经验用户将遵循规则。同时,解析器将检测文件结构中的不一致性
  • 使用非人类可读的二进制格式,如Pickle。这些文件可能会被用户单独留下,因为很明显,它们不打算在程序之外修改
  • 使用数据库,如MySQL。数据库为数据访问提供了特殊的协议,可用于确保数据一致性,并使其更容易防止不必要的访问

假设您的文件格式有注释字符,或者可以修改为有注释字符,请在文本文件顶部添加以下行:

# Do not edit this file. This file was automatically generated.
# Any change, no matter how slight, may corrupt this file beyond repair.
联系人文件属于您的用户,而不是您。你所能做的就是通知用户。您所能期望的最好结果是用户能够智能地使用您的产品

我想防止用户打开文件,不小心弄乱了数据

我建议您不要阻止用户访问自己的文件。扰乱文件权限可能会导致用户无法清除某些恶意文件信任您的用户。如果他们删除或编辑敏感文件,那是他们的错。这样想吧——你的电脑上安装了很多软件,但你多久会在编辑器中打开它们并做出一些破坏性的更改?即使您确实编辑了这些文件,应用程序开发人员是否阻止您这样做

如果您确实希望允许用户更改/修改该文件,请向他们提供有关如何更改/修改该文件的良好文档。这是最恰当的做法。另外,在运行时创建一个备份文件(请参见下面的
tempfile
),作为一个附加的安全层。备份几乎总是一个好主意

但是,您可以采取一些预防措施来隐藏该数据,以便用户不会通过双击在编辑器中意外打开它们。有很多选择可以做到这一点,包括

  • 以自定义格式创建二进制文件
  • 使用模块压缩文本文件
  • 使用模块创建临时文件,并使用上一个选项对其进行压缩。(如果不需要保存更改,则很容易放弃)
  • 加密
  • 从现在开始,一切都不是为了阻止访问,而是为了隐藏文件的内容 请注意,上述所有选项不必相互排斥。使用zip文件的优点是可以节省一些空间,并且在文本编辑器(二进制数据)中不容易读取和编辑。它可以在Python脚本中轻松操作:

    with ZipFile('spam.zip') as myzip:
        with myzip.open('eggs.txt') as myfile:
            print(myfile.read())
    
    就这么简单!另一方面,临时文件是一个易失性的(
    delete=True/False
    )文件,一旦处理完毕,就可以将其丢弃。您可以轻松地将其内容复制到另一个文件中,或者在如上所述关闭它之前对其进行压缩

    with open tempfile.NamedTemporaryFile() as temp:
        temp.write(b"Binary Data")
    
    同样,另一个简单的过程。但是,必须对其进行压缩或加密才能获得最终结果。现在,转到加密。最简单的方法是XOR密码。由于我们只是试图防止“可读性”,而不关心安全性,因此您可以执行以下操作:

    建议的解决方案(
    XOR
    cipher): 注意f有多小
    from itertools import cycle
    
    
    def xorcize(data, key):
        """Return a string of xor mutated data."""
        return "".join(chr(ord(a)^ord(b)) for a, b in zip(data, cycle(key)))
    
    
    data = "Something came in the mail today"
    key = "Deez Nuts"
    
    encdata = xorcize(data, key)
    decdata = xorcize(encdata, key)
    
    print(data, encdata, decdata, sep="\n")