![如何限制文件名中允许使用哪些字符?](https://linux22.com/image/215403/%E5%A6%82%E4%BD%95%E9%99%90%E5%88%B6%E6%96%87%E4%BB%B6%E5%90%8D%E4%B8%AD%E5%85%81%E8%AE%B8%E4%BD%BF%E7%94%A8%E5%93%AA%E4%BA%9B%E5%AD%97%E7%AC%A6%EF%BC%9F.png)
跟进修复 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 探针,您可能可以执行相同的操作,而无需推断额外的上下文切换开销(并且无需实现文件系统或添加内核模块)。但我从来没有尝试过。
由于该文章的作者可能对其他人(尤其是那些编写操作系统和实用程序的人)可能不会分享的文件名有问题有特定的看法,因此我认为没有一个现成的工具可以完全满足您的要求想要 - 但只需几行代码就可以很容易地进行编码。