0

我有一台Linux服务器,我的网站上有一个上传图片,注册的用户可以上传他的图片,当他登录到他的个人资料时,他可以看到他的图片,也可以得到他的图片的url链接,所以图片上传到服务器的 WWW/img 目录我正在检查 php 文件的扩展名,只允许 (.png ,.gif,.jpg) 文件

但是我不知道为什么有人上传了一张 gif 图像并删除了我所有的文件,我得到了用户上传的图像,因为我们有 RAID,图像的内容类似于......

function vUMmFr($MkUOmK){$MkUOmK=gzinflate(base64_decode($MkUOmK));for($i=0;$i<strlen($MkUOmK);$i++){$MkUOmK[$i]=chr(ord($MkUOmK[$i])-1)}return $MkUOmK}eval(vUMmFr("7b1pe+M2sij8ved55j............

这是什么,这是怎么发生的,所有的文件是怎么被删除的?这是什么语言,我怎样才能保护文件不被删除..

4

1 回答 1

4

您可能有一个写得很糟糕的文件上传处理程序,它盲目地信任用户提供的内容,将具有原始用户提供的文件名的文件放入您的 webroot 中可公开访问的目录中。简而言之,您的文件上传脚本相当于一个闪烁着“HACK ME!”的大霓虹灯。.

例如,像这样:

<?php

if ($_FILES['file']['type'] == 'image/gif') {
    move_uploaded_files($_FILES['file']['tmp_name'], '/some/path/in/your/docroot/' . $_FILES['file']['name']);
}

这里有问题:

  1. 不检查错误 - 文件上传可能由于多种原因而失败,不检查错误是一件非常糟糕的事情
  2. ['type']字段是用户提供的数据 - 恶意用户可以轻松伪造该 mime 类型。他们可以很容易地上传“somescript.php”,但将其标记为图像。
  3. 盲目地使用['name']参数作为您存储文件的路径的一部分。同样,这是在用户的控制之下。一名恶意用户和您的服务器将自己冲下马桶。
  4. 将文件存储在 docroot 中。因此,现在您允许上传具有任何名称的任何类型的任何文件。如果它是一个脚本,并且文件的位置可以通过 URL 访问,那么您现在允许远程用户在您的服务器上执行他们想要的任何代码。

简而言之,在处理文件上传时,您将文件视为距离爆炸 0.001 秒的准备爆炸的核弹。您不使用原始文件名存储它。您不会将其存储在用户可以获取的任何地方。您不使用可预测的文件名存储它。您对文件进行服务器端验证。你掀起文件的裙子,看看引擎盖下的内容,以确保它是它应该是的......即使那样你仍然认为它在撒谎。

于 2012-09-23T03:25:45.233 回答