有没有办法按文件类型限制目录内容?
例如,我有一个上传目录,我只希望用户将图像放入其中,我可以更进一步并实际设置一个只允许图像放入其中的限制吗?
我想过一个 CRON 工作来检查文件扩展名,但想知道是否有另一种方法......
尝试使用 cron 作业或类似的“事后”强制执行此操作存在许多问题:
比赛条件。无论您使用哪种方法,如果您有一些程序或一些代码将查看目录并可能选择和使用您不希望它与之交互的文件,那么实际阻止它这样做的唯一方法是要么 (1) 以这种方式对其进行编码(或者修改现有的源代码,如果它是开源的);或 (2) 首先不允许将文件放置在该目录中。
您没有说明您正在运行哪个操作系统,但在 Linux 上,您可以有效fanotify
地监视目录中的文件创建/重命名,并在创建不允许的文件或将其重命名为不允许的名称或内容时采取措施。当然,这本质上是一种竞争条件,因此如果您有其他代码将访问该目录,而“用户”(其他程序或用户帐户)将在其中放置文件,则您不可能绝对阻止这些文件从被拿起(并且可能在您的代码有机会删除/移动它们之前阅读)。
我的建议是这样的:
创建一个新组,或使用现有组,其唯一成员是您信任不会运行任何会将不需要的文件放在该目录中的程序的用户。
将目录的权限设置为 770 或 775 之类的内容,chmod
并chown
分别使用和适当地设置组和用户所有者。这将阻止该组之外的用户访问(分别写入)该目录,因此您不信任将正确文件放入其中的程序/用户将被排除在外文件系统的自由访问控制机制。这应该适用于几乎所有类似 UNIX(甚至 Windows,但那里的权限系统略有不同)。只要确保您没有将此目录存储在 ntfs-3g 或其他忽略自由访问控制的文件系统上。
编写一个程序,或使用现有程序,提供一个服务(Web 服务、UNIX 域套接字或其他东西),该服务将接受文件内容以及用于“上传”的文件名。然后,该程序应接收来自用户的整个文件,将其存储在 RAM 或临时文件夹中,直到完全下载,然后检查文件名和内容以确保不需要的文件类型的文件抛出错误,并且不会被放置在目录中。如果文件显示正常,您可以将文件内容写入上述受限制的组目录中的所需文件名。
对于上一段的“使用现有程序”组件,我搜索了一下,只能找到一种可能的解决方案(而且它甚至不是很强大):Samba支持文件扩展名 blacklisting。但是,您应该知道,任何包含任意内容的文件都可以重命名为包含任何文件扩展名,以轻松绕过文件扩展名检查。文件扩展名检查可用于防止用户意外激活可执行文件(例如;如果您将可执行文件上传为 .txt,它将在用户的文本编辑器中无害地打开,最坏的后果可能是冻结文本编辑器,因为该文件太大;然而,如果他们上传扩展名为 .exe 的文件,则双击 Windows 将运行该文件)。
但是文件扩展名检查本身并不能确保该目录的文件是(或所需类型不的不想要的类型)。为此,您需要某种钩子来“在文件上传时”调用自定义代码,例如在 FTP 服务器中(我不知道任何可以通过这种方式扩展的 FTP 服务器,在我的脑海中) -- 然后file
在结果上调用例如 UNIX 实用程序以查看它是否属于不需要的类型。file
不是防弹的,但它非常擅长识别文件的内容,无论其名称如何。
我要留给您思考的最后一件事是:如果您超越表面,则不允许不想要的文件内容的问题要大得多。例如,假设您从 PDF 文档开始。现在,在该 PDF 文档中翻转一位,使文件的格式现在违反 PDF 标准。如果您在“天真的”PDF 阅读器中打开此文件,它会因文件格式被违反而无法打开。但是,如果您在“智能”PDF 阅读器中打开它,它或许能够自动检测并修复损坏!如果损坏足够严重,您的文件类型检测程序可能会误以为它甚至不是 PDF 文档。但最终用户可能仍然能够打开该文件。
更糟糕的是,如果您试图禁止传输特定的文件内容或文件类型,用户可以通过多种方式绕过它。一种方法是故意破坏无法识别的文件头,使您的黑名单无法识别文件类型,从而默认允许它通过;或者,如果您有白名单,将文件伪装为允许类型的有效文件格式,但随后让内容包含实际负载。一对合作的用户(或远程控制另一个用户的攻击者)可以上传然后下载此文件,将接收端的内容更改为所需的格式,并使用该数据。
这进入了隐写术领域,在那里您可以使用已灭绝的剑龙 DNA 来尝试确定文件是否属于给定类型;-)(开玩笑;隐写术与隐写术无关 :))。在隐写术中,文件表面上看起来完全合法,甚至可以被白名单过滤器允许;但是攻击者可以与其他用户合作,通过将任意数据(以任何文件格式)隐藏在现有文件的看似有效的数据中来进行通信。隐写术可能非常难以检测。
但是,如果您的意图只是阻止“快乐路径”文件类型,其中文件公开并公然声明自己属于特定类型,您可以file
在允许通过 FTP 上传的暂存目录中的文件上使用类似的东西,然后,如果文件根据您的测试“检出”,您可以将其移至受限目录。这将完美地防止未受过密码学/隐写术培训的用户将不需要的文件类型上传到您的系统。
归档时间: |
|
查看次数: |
4911 次 |
最近记录: |