PHP上传文件类型
我目前正在为一个站点im构建构建一个文件上传程序,我对文件类型有问题,我需要它能够上传html、css、javascript、json文件,但不能上传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"))
<?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;
}