2012-01-07 66 views
0

我试图编写上传脚本,只接受上传的PNG图像。上传脚本工作正常,但是当我添加png图像检测时,它会中断。PHP上传文件过滤

这是我如何把它设置了:

if ($_FILES) { 

     if ($_FILES["file"]["type"] == "image/png") { 

     $target_path = "uploads/"; 
     $target_path = $target_path . basename($_FILES['uploadedfile']['name']); 

     if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { 
      echo "The file ". basename($_FILES['uploadedfile']['name']). 
      " has been uploaded"; 
     } else{ 
      echo "There was an error uploading the file, please try again!"; 
     } 

     } else { echo "Not A PNG…"; 

     } 

    } 

当我上传PNG图像,我得到“不是PNG”错误 - 任何想法?

+0

你确定它的PNG图像,只有png格式的扩展而不是其他格式? – BartekR 2012-01-07 22:47:51

+0

是的,我查过了。 – Thomas 2012-01-07 22:54:16

+0

我意识到问题是由于名称错误而导致缺少这种功能,但值得一提的是其他人已经提到,那里提供的字符串不可信。这是绝对正确的,由于您没有检查关于该文件的其他任何信息,因此可以轻松地绕过此检查以允许将任意代码(或其他任何内容)上传到您的系统。我建议采取其他措施来确保此上传脚本的安全,否则在不久的将来可能会出现安全问题。 – 2012-01-08 00:00:54

回答

3

它看起来像你引用的文件错误的IF语句:

if ($_FILES["file"]["type"] == "image/png") { 

应该

if ($_FILES["uploadedfile"]["type"] == "image/png") { 

( “文件” 需要 “的UploadedFile”)

+0

谢谢,我完全错过了 - 一旦定时器启动,我会检查它。 – Thomas 2012-01-07 22:53:27

+2

此脚本不保证图像*是* png图像。 Mimetype可以轻松伪装。 – 2012-01-07 22:53:28

+0

Srsly,这是问题吗?大声笑 - 顺便说一句,如果你想使用PHP-GD的适当的PNG验证,请参阅我的帖子下面,漂亮的眼睛@Ben D – Prof83 2012-01-07 22:56:17

2

我已经看到一些服务器不会在$ _FILES变量中添加MIME类型图像/ png ...稍微有点CPU更重的方式:

if (@imagecreatefrompng($_FILES["file"]["tmp_name"]) 

如您使用的是GD库打开图像画布

如果性能或缺乏GD库是一个问题,简单地检查扩这里的性能会略微降低:

if (strtolower(end(explode('.',$_FILES["file"]["name"])) == 'png') 

注意 如果你想使用的功能imagecreatefrompng,这将是最好确保GD安装:if (function_exists('imagecreatefrompng'))


重要 如果你对内存的使用持谨慎态度(你应该)做

if ($image = @imagecreatefrompng($_FILES["file"]["tmp_name"]) { 
    // Do something 
    imagedestroy($image); 
    } 
2
  1. 切勿使用$_FILES[...]['type']什么。它只是一个随意的,用户提供的字符串,它可能与实际文件没有任何关系。
  2. 因此,请自己检查MIME类型。
  3. 启用error_reporting(E_ALL); ini_set('display_errors', true);,这将帮助您找到您的特定拼写错误。
  4. 习惯不及格
  5. 2和4

例子:

if (!empty($_FILES['uploadedfile'])) { 
    if ($_FILES['uploadedfile']['error'] !== UPLOAD_ERR_OK) { 
     die('Error during upload'); 
    } 
    if (exif_imagetype($_FILES['uploadedfile']['tmp_name']) !== IMAGETYPE_PNG) { 
     die('Wrong file type'); 
    } 
    ... 
}