如何限制文件名中允许使用哪些字符?

l0b*_*0b0 5 filesystems security files linux-kernel

跟进修复 Unix/Linux/POSIX 文件名:控制字符(例如换行符)、前导破折号和其他问题*,是否有某种方法可以禁止在任何常用的 Linux 内核/文件系统上创建名称有问题的文件?这需要在较低级别上强制执行,因此除了通过 root 访问更改配置之外,任何修改都无法创建此类文件名。例如,告诉文件系统驱动程序仅接受有效的 UTF-8 序列(不带控制字符、换行符以及可能的其他字符(例如名称开头的连字符))的挂载选项将是理想的选择。

用例主要是安全强化,但也能够在代码中处理文件名,而无需进行可怕的黑客攻击(请参阅上面的文章以获取大量详细信息)。

*:迄今为止在答案和评论中提出的大部分观点已在本文中得到解决。发帖前请检查一下。

Mar*_*ler 2

有没有办法禁止在任何常用的 Linux 内核/文件系统上创建名称有问题的文件?

就在这里。

fanotify可以让用户态程序拦截您想要观看的任何目录树上的文件操作。这可以用来实现诸如使用禁止的文件名之类的事情。

使用内核 ebpf 探针,您可能可以执行相同的操作,而无需推断额外的上下文切换开销(并且无需实现文件系统或添加内核模块)。但我从来没有尝试过。

由于该文章的作者可能对其他人(尤其是那些编写操作系统和实用程序的人)可能不会分享的文件名有问题有特定的看法,因此我认为没有一个现成的工具可以完全满足您的要求想要 - 但只需几行代码就可以很容易地进行编码。

  • 顺便说一句,我完全反对链接文章试图提出的观点:它不是从不良软件中删除不必要的假设,而是主张在文件系统层添加不必要的假设。恕我直言,这是错误的做法。如果有人无法编写处理文件名中换行符的程序,那么世界其他地方就不必做得更好。我认为我不同意文件名的用途(始终是文件的人类可读标识符)的前提 - 但这根本不会改变您的问题是一个有趣且相关的问题! (4认同)
  • “专家可以做到”的缺点是,任何需要这样做的人都必须是专家。当我们谈论像_文件名_这样琐碎的事情时,这就造成了一种很高的门槛。或者,嗯,显然不是微不足道的,而是像文件名一样_常见_的东西。我从来没有真正想过应该可以在文件名或控制字符中包含换行符。它们对于命名事物来说似乎相当不必要(实际上,如果你的名字有多行,可能是时候重新考虑了),而且它不像任意二进制数据工作,因为斜杠和 NUL 需要特别小心。 (3认同)
  • 您是否看过那些令人难以置信的丑陋黑客,您必须使用它来安全地循环遍历任意文件名(或者更糟糕的是,可移植)?如果我们真的将文件名视为二进制 blob(没有 NUL 或正斜杠),那么它们对于 99.999% 的用例(即向最终用户显示它们)来说将毫无用处。到那时,我们最好只使用索引节点来处理所有事情。 (2认同)
  • @roaima 是的,这里也一样。特别是因为文件名的目的是在长期存在的介质上存储数据——今天禁止某些东西可以解决问题,但只能在很遥远的将来;到了 2043 年,当有人挖掘税务数据磁带并尝试使用假定受限制名称的工具来处理文件名时,他们会遇到非常不愉快的意外。标准化有用的工具可以立即解决问题,无论哪种方式,未来我们都需要这些工具。 (2认同)