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

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

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

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

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

答案1

至少有一项关于限制文件名的模块的提案。它现在/曾经是一个 Linux 安全模块 (LSM),由 David A. Wheeler 开发,他是《Fiking Unix/Linux/POSIX Filenames》一书的作者。

这里有一篇关于它的 LWN 文章: Safename:限制“危险”文件名。文章中有包含补丁的电子邮件的链接。这是从 2016 年 5 月开始的,我还没有亲自尝试过,我不知道它是否有任何吸引力,或者是否可以移植到最近的内核。但该建议已在实际代码中提出。

答案2

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

就在这里。

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

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

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

相关内容