Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.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 如何使用MIME而不是只检测图像扩展名的允许文件类型执行安全图像上载_Php - Fatal编程技术网

Php 如何使用MIME而不是只检测图像扩展名的允许文件类型执行安全图像上载

Php 如何使用MIME而不是只检测图像扩展名的允许文件类型执行安全图像上载,php,Php,我编写了一个php脚本,它检查图像文件的扩展名,例如JPG、JPEG、PNG、GIF,这些文件是通过HTML表单上传的 现在我的问题来了:任何人都可以上传任何类型的文件,只要给它一个JPG,JPEG,PNG,GIF的扩展名 有人能帮我吗?一个应该严格能够上传只有一个图像文件,而不是任何其他文件,携带只是图像文件的扩展名 我努力了。。。但是失败了。。。下面是我编写的php脚本 检查我编写的完整代码&其工作正常,但当我更改任何文件扩展名时,其允许上传到服务器上,但不是SERCURE,请查看此完整代码

我编写了一个php脚本,它检查图像文件的扩展名,例如JPG、JPEG、PNG、GIF,这些文件是通过HTML表单上传的

现在我的问题来了:任何人都可以上传任何类型的文件,只要给它一个JPG,JPEG,PNG,GIF的扩展名

有人能帮我吗?一个应该严格能够上传只有一个图像文件,而不是任何其他文件,携带只是图像文件的扩展名

我努力了。。。但是失败了。。。下面是我编写的php脚本 检查我编写的完整代码&其工作正常,但当我更改任何文件扩展名时,其允许上传到服务器上,但不是SERCURE,请查看此完整代码并添加解决方案,这也将帮助其他人-谢谢

if(isset($\u POST['submit']))
$filename=$_文件[“文件”][“名称”];
$file_basename=substr($filename,0,stripos($filename,'.');//获取文件扩展名
$file_ext=substr($filename,stripos($filename,'.');//获取文件名
$filesize=$_文件[“文件”][“大小”];
$allowed_file_types=数组('.jpg'、'.png'、'.jpeg'、'.gif');
//我想用MIME检查图像的真实性,而不是允许的文件类型
if(在数组中($file\u ext,$allowed\u file\u types)&&($filesize<100000))
您应该使用API,它使您能够通过查看文件的字节而不是名称来检查文件MIME内容类型

图像MIME类型总是以
image/
开头,例如
image/png

$finfo=新的finfo();
$mimeType=$finfo->file($\u FILES['file']['tmp\u name'],FILEINFO\u MIME\u TYPE);
$isImage=strpos($mimeType,'image/')==0;
如果您想对允许的图像进行非常严格的限制,请查看

编辑:更加具体

if(isset($\u POST['submit'])){
$filename=$\u文件[“文件”][“tmp\u名称”];
$filesize=$_文件[“文件”][“大小”];
$allowed_file_types=数组('image/jpeg'、'image/png'、'image/gif');
$finfo=新的finfo();
$mimeType=$finfo->file($filename,FILEINFO\u MIME\u TYPE);
$isImage=in_数组($mimeType,$allowed_file_types);
如果($isImage&&$filesize<100000){

检查某个文件是否真的是图像的最安全方法是将该文件作为图像打开,然后重新生成它

有效的图像仍然可以承载大量的其他信息,有时还可以欺骗任何正在读取它的人。因此,最安全的方法是从图像中提取像素,并重新生成它


fileinfo
这样的扩展只检查标记的前几个字节,但它不是100%可靠的。它可能对您来说足够好了

请在上面的代码上下文中回答,如何将此代码应用到上面的代码请指定我已经编辑了它。请注意,我使用
tmp\u name
键在服务器端检索文件名,而不是<代码>名称哪一个是客户端。先生不工作请检查我的完整代码并为其添加解决方案希望你在开玩笑,伙计:)我不是来做你的工作的。这段代码工作正常,即使你说它不工作。还记得当你要求我指定时吗?我在我当前的答案和另一个看起来像你的步骤的答案之间犹豫,使用
imagick
API,但由于它在我看来是一个初学者问题,而且与
Imagick
相比,
fileinfo
的大小很小,因此我选择了
fileinfo
@rugolinifr yea,我认为这是一个可以有两个有效答案的好问题=)
if (isset($_POST['submit']))

    $filename = $_FILES["file"]["name"];
    $file_basename = substr($filename, 0, strripos($filename, '.')); // get file extention
    $file_ext = substr($filename, strripos($filename, '.')); // get file name
    $filesize = $_FILES["file"]["size"];
    $allowed_file_types = array('.jpg','.png','.jpeg','.gif');  
    
    //instead of allowed file type i want to check image authenticity with MIME

    if (in_array($file_ext,$allowed_file_types) && ($filesize < 100000))