Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP上传文件类型_Php_File - Fatal编程技术网

PHP上传文件类型

PHP上传文件类型,php,file,Php,File,我目前正在为一个站点im构建构建一个文件上传程序,我对文件类型有问题,我需要它能够上传html、css、javascript、json文件,但不能上传PHP等。我的问题是我似乎无法找出文件类型名称。详见下文 <?php if (($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") || ($_FILES["file"]["type"] == "image/pjpeg"))

我目前正在为一个站点im构建构建一个文件上传程序,我对文件类型有问题,我需要它能够上传html、css、javascript、json文件,但不能上传PHP等。我的问题是我似乎无法找出文件类型名称。详见下文

<?php
 if (($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
{
if ($_FILES["file"]["error"] > 0)
  {
  echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
  }
 else
  {
  echo "Upload: " . $_FILES["file"]["name"] . "<br />";
  echo "Type: " . $_FILES["file"]["type"] . "<br />";
  echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
 echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

  if (file_exists("upload/" . $_FILES["file"]["name"]))
  {
  echo $_FILES["file"]["name"] . " already exists. ";
  }
else
  {
  move_uploaded_file($_FILES["file"]["tmp_name"],
  "upload/" . $_FILES["file"]["name"]);
  echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
  }
   }
  }
  else
  {
  echo "Invalid file";
  }
?>


在有image/jpeg的地方,我尝试了.html和html,但都没有用,还有.js等等,我就是想不出来!救命!!!:如果您指的是:

echo "Type: " . $_FILES["file"]["type"] . "<br />";
要允许/不允许,最好使用开关:

switch ($_FILES["file"]["type"]) {
    case 'image/jpeg':
    case 'image/gif':
        // Allowed
    break;
    default:
        // Not allowed
    break;
}


switch ($ext) {
    case 'jpeg':
    case 'gif':
    case 'jpg':
        // Allowed
    break;
    default:
        // Not allowed
    break;
}

我可以建议一种不同的方法吗

检查扩展名,而不是依赖于文件类型

这方面的一个小例子是:

$parts = array();
$parts = explode( ".", $_FILES['file']['name'] );

if ( !empty($parts) && is_array($parts) ) {
    $extension = end( $parts );
} else {
    echo "File name has no extension";
}

if ( $extension == "jpg" || $extension == "jpeg" ) {
    // Do something with the jpeg
} elseif ( $extension == "html" ) {
    // Do something with html
} elseif ( $extension == "js" ) {
    // Do something with js
} else if ( ... /* You can add any conditional based on extension here */ ) {
    // And do whatever you want here
}
这是一个包含多个if/elseif语句的基本粗糙示例,您可以创建一个切换条件、一个工厂类等。。。但想法还是一样


干杯。

$\u文件中依赖客户端文件类型是不安全的,最好从文件内容中获取

function mime_type($file_path)
{
    if (function_exists('finfo_open')) {            
        $finfo = new finfo(FILEINFO_MIME_TYPE, null);
        $mime_type = $finfo->file($file_path);
    }
    if (!$mime_type && function_exists('passthru') && function_exists('escapeshellarg')) {
        ob_start();
        passthru(sprintf('file -b --mime %s 2>/dev/null', escapeshellarg($file_path)), $return);
        if ($return > 0) {
            ob_end_clean();
            $mime_type = null;
        }
        $type = trim(ob_get_clean());
        if (!preg_match('#^([a-z0-9\-]+/[a-z0-9\-\.]+)#i', $type, $match)) {
            $mime_type = null;
        }
        $mime_type = $match[1];
    }
    return $mime_type;
}

尝试添加更多与$_FILES['file']['type']的比较,例如,如果text/htmlNote文件类型/mimetype可以被欺骗,则不是reliable@jayhassett89:为什么要阻止PHP文件?是因为安全吗?因为如果是这样的话,上传HTML(或者在这种情况下,甚至是一些浏览器的JPGs/etc)可能会让你受到XSS攻击。您应该改用switch/case。同意,我注意到这只是一个“最重要的示例”,在代码示例下应该以不同的方式完成。:)<代码>$\u文件[“文件”][“类型”]
可以被欺骗!谢谢,从安全角度来说,文件扩展名可能是一个更好的主意,如果我的问题不清楚,很抱歉:)
function mime_type($file_path)
{
    if (function_exists('finfo_open')) {            
        $finfo = new finfo(FILEINFO_MIME_TYPE, null);
        $mime_type = $finfo->file($file_path);
    }
    if (!$mime_type && function_exists('passthru') && function_exists('escapeshellarg')) {
        ob_start();
        passthru(sprintf('file -b --mime %s 2>/dev/null', escapeshellarg($file_path)), $return);
        if ($return > 0) {
            ob_end_clean();
            $mime_type = null;
        }
        $type = trim(ob_get_clean());
        if (!preg_match('#^([a-z0-9\-]+/[a-z0-9\-\.]+)#i', $type, $match)) {
            $mime_type = null;
        }
        $mime_type = $match[1];
    }
    return $mime_type;
}