0

需要允许用户上传几乎任何文件类型,但显然我不希望上传任何恶意文件。例如,上传表单需要允许 .js 和 .php 脚本之类的内容。

白名单可能是无穷无尽的,黑名单可能会阻止上传合法文件,而且我不确定这些选项甚至提供了多少(如果有的话)实际安全性。

我使用的是带有前端控制器的 CakePHP,因此您无法直接通过浏览器访问上传的文件。文件上传为-rw-r--r--.

我最好的选择是什么?服务器的保护程度如何?

4

3 回答 3

1

目前尚不清楚“通过 CakePHP 路由,然后将文件提供给您”是什么意思,但是,鉴于这个问题,我的印象是上传的文件会被放到公共目录下webroot,原始扩展名完好无损,并由Web 服务器就像您通过 FTP 上传的任何其他文件一样。

如果是这种情况,您就会遇到一个突出的安全问题,您需要解决根本问题,而不是试图通过弱解决方法来缓解其影响。

在处理用户上传的文件时,您需要确保它们始终作为数据处理,而不是作为脚本处理。您可以创建一个特殊目录,其中所有文件都作为数据处理,无论文件扩展名如何,但您需要调整 Web 服务器配置,并且您必须期望将来不会有任何问题。或者,更好的是,将您的上传目录放在文档根目录之外(或至少放在 Web 服务器无法访问的位置)并编写一个 PHP 包装器来读取文件并按原样提供它(即下载脚本) .

于 2012-12-05T15:54:49.097 回答
1

您最好的选择是将数据作为 BLOB 直接上传到数据库中,而不是允许用户上传到文件系统。

文件系统很复杂,允许用户直接上传给他们会引入大量潜在的安全漏洞;例如,如果有人上传了一个名为“foo.php\0.jpg”的文件(其中 \0 是字节值零,即 nul 字符),那么您的 PHP 可能会注意到该字符串以文本“.jpg”结尾因此是“安全的”。

但是当字符串 "foo.php\0.jpg" 进入PHP的 fopen时,它将被视为以 null 结尾的字符串 "foo.php",从而有效地允许您的用户将任意 PHP 上传到您的网站。

同样,很难阻止恶意用户上传到 /dev/hd0/ 或 htt*://1.2.3.4/ 或 \?\WEBDAV\1.2.3.4\ 或 CON.txt 或任何其他讨厌的文件系统边缘情况你几乎肯定没有想过。

为了安全起见,最好的方法是确保用户数据只存储在您的数据库中(这就是他们称之为的原因)。另外确保参数化您的 SQL,然后您将相当安全地免受恶意攻击。

您可以随时使用 PHP 脚本将数据从数据库中提取出来,以便提供给其他访问者,因此这样做可以大大提高安全性,而且几乎没有重大缺陷。

于 2012-12-05T22:08:29.173 回答
0
  1. 检查扩展列表(不要使用爆炸来检查扩展,而是使用 pathinfo())。
  2. 还要检查文件的 mimetype。
  3. 使用白名单而不是黑名单,即使它非常大,它始终是更安全的解决方案。
于 2012-12-05T15:26:18.383 回答