`
天梯梦
  • 浏览: 13698888 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

PHP判断上传文件类型(防修改后缀)

阅读更多

      网上流传着一种说法,用PHP读文件头部两个字节判断文件真实类型,其实这样判断也是不精确的,就拿office的文件类型来说。

      word以前的格式是storage方式存储,但是现在最新版本的docx是一个zip包。

      即使是以前的storage方式存储的格式,也不能确定就是word文档,因为qq聊天记录也是采用这种方式存储的。所以,如果从文件格式分析的话,将会是很复杂的事情,但是可以实现精确的判断是不是word文档


      比如,读取storage结构,判断里面的子节点名字,如果是docx格式,先用zlib解压,再判断里面的xml文件和目录名字,等等,其他office格式类似。


      从上面一个简单的判断,我们可以得知,读文件头是不能真实判断文件类型的,判断文件类型,是一个很复杂的工作,下面是php读文件头判断文件类型的代码,但是不精准,可以作为参考。不过,除了office,其他还是挺准的。

 

 

<?php   

function file_type($filename)
{
    $file = fopen($filename, "rb");
    $bin = fread($file, 2); //只读2字节
    fclose($file);
    $strInfo = @unpack("C2chars", $bin);
    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
    $fileType = '';
    switch ($typeCode)
    {
        case 7790:
            $fileType = 'exe';
            break;
        case 7784:
            $fileType = 'midi';
            break;
        case 8297:
            $fileType = 'rar';
            break;        
		case 8075:
            $fileType = 'zip';
            break;
        case 255216:
            $fileType = 'jpg';
            break;
        case 7173:
            $fileType = 'gif';
            break;
        case 6677:
            $fileType = 'bmp';
            break;
        case 13780:
            $fileType = 'png';
            break;
        default:
            $fileType = 'unknown: '.$typeCode;
    }

	//Fix
	if ($strInfo['chars1']=='-1' AND $strInfo['chars2']=='-40' ) return 'jpg';
	if ($strInfo['chars1']=='-119' AND $strInfo['chars2']=='80' ) return 'png';

    return $fileType;
}

echo file_type('start.php');   // 6063 or 6033
 


但是我不知道反过来定义 6063或者6033 就是指php的话 是不是不够严谨啊。

 

对于上传文件类型的判断,一直没有太好的办法,即使使用上面的代码,也有办法构造假的图片 的(如何构造不再传播),有人使用getimagesize来判断,不失为一种好办法:

 

if(in_array($attach['ext'], array('jpg', 'jpeg', 'gif', 'png', 'swf', 'bmp')) && function_exists('getimagesize') && !@getimagesize($target)) 
{
    unlink($target);
    upload_error('post_attachment_ext_notallowed', $attacharray);
}
 

 

 

 

 

分享到:
评论

相关推荐

    php 文件上传后缀名与文件类型对照表(几乎涵盖所有文件).pdf

    本文对 PHP 文件上传后缀名与文件类型对照表进行了详细的解释和分析,并对 PHP 文件上传类型判断和限制进行了介绍。了解文件类型和后缀名对于 PHP 文件上传来说非常重要,可以帮助我们更好地判断文件类型和限制文件...

    php判断文件上传图片格式的实例详解

    在处理PHP文件上传功能时,经常会遇到需要判断上传文件是否为图片类型的场景。根据给出的文件内容,我们可以详细学习如何在PHP中判断上传文件的图片格式,并给出了详细的实现代码。 首先,通常情况下,我们可以通过...

    php 获取文件后缀名,并判断是否合法的函数

    通过上述内容,我们了解到如何在PHP中获取文件的后缀名,并通过与预设的后缀名数组进行比较,实现对上传文件类型的安全检查。这个方法简单有效,能够帮助开发者在实际项目中防范上传恶意文件的风险,保证网站的安全...

    上传后缀绕过

    例如,将文件命名为`evil.php.txt`,服务器可能仅根据`.txt`后缀判断文件类型而忽略真正的`.php`部分,这样就可以绕过扩展名检查。 ##### 0x05: JavaScript文件绕过 一些服务器配置允许JavaScript文件执行,因此...

    PHP文件上传后缀名与文件类型对照表整理

    文件类型通常由文件扩展名(后缀名)来表示,但为了安全起见,仅仅依赖扩展名来判断文件类型是不足够的,还需要通过文件的MIME类型来进行验证。 MIME类型(Multipurpose Internet Mail Extensions,多用途互联网...

    php上传文件常见问题总结

    4. 严格判断上传文件类型 单纯地依赖文件扩展名来判断文件类型是不安全的,因为文件名可以被轻易更改。为了更安全地获取文件类型,建议使用PHP的`fileinfo`扩展。这个扩展能够通过分析文件的内容来确定其正确的MIME...

    PHP使用finfo_file&#40;&#41;函数检测上传图片类型的实现方法

    在我们的Web应用中,比如用户上传头像,要求是png,jpg,gif格式,接收到图片后会根据图片格式类型做不同的头像切割处理,但个别用户会传一些只更改过文件后缀的非标准图片,比如nowamagic.jpg 强行修改成 nowamagic....

    php上传功能集后缀名判断和随机命名(强力推荐)

    本文介绍的是如何在PHP中实现文件上传功能,并结合文件后缀名的判断和随机命名,旨在提供一个安全而简单的文件上传解决方案。在进行文件上传时,为了防止恶意脚本通过上传不可信任的文件类型造成系统安全问题,进行...

    php实现获取文件mime类型的方法

    在这三种方法中,通过文件后缀来判断MIME类型并不被推荐,因为文件的后缀是可以被用户或者上传者修改的,这样会导致获取到错误的MIME类型。而使用上述方法可以获取到文件实际的内容类型,从而提高程序的准确性和安全...

    PHP实现多文件上传的方法

    首先,定义上传文件的允许后缀名是实现文件上传的第一步。PHP脚本中通过数组`$allowExt`设置了允许上传的文件类型,如图片(.jpg, .png, .gif等)、文档(.pdf, .doc等)和其他文件类型(.zip, .rar等)。限制文件类型是...

    php关于上传图片的验证

    头信息验证比后缀名验证更可靠,它会读取文件的头部字节来判断文件类型。PHP中的`finfo_file`函数或`mime_content_type`函数可以实现这个功能。这些函数会检测文件的MIME类型,确保它是图片类型。以下是一个例子: ...

    php实现文件管理与基础功能操作

    在实际应用中,这些函数和方法的组合使用可以实现各种复杂的文件管理和操作,比如文件上传、下载、移动、重命名、权限设置等。理解并熟练运用这些基础功能,是成为一名合格的PHP开发者的重要一步。在编写代码时,应...

    功能强大的php文件上传类

    本文介绍了一个功能强大的PHP文件上传类,该类可以简化文件上传的过程,并提供了一些基本的功能验证,例如检查文件大小、文件类型、文件是否存在以及文件重名处理等。 首先,类中定义了一些私有变量来存储文件上传...

    PHP文件上传类实例详解

    对于文件上传的处理,PHP主要通过 $_FILES 数组中的信息来判断上传的文件是否成功,并且是否符合预期的要求。 在实例中,我们看到一个名为 FileUpload 的类被定义用来处理上传文件。这个类包含了文件上传处理的全部...

    文件系统.pptx

    - **`filemtime()`**:获取文件的最后修改时间(以UNIX时间戳形式返回)。参数为文件路径。 - **`fileatime()`**:获取文件的最后访问时间(以UNIX时间戳形式返回)。参数为文件路径。 - **`stat()`**:用于获取文件...

    借github上韩国师傅的一个源码实例再次理解.htaccess的功效1

    接下来,WAF检查文件是否存在敏感字符,以及通过`image_type()`函数判断文件类型。这一步可以通过在HTTP请求中修改文件头信息来规避,特别是当文件头被识别为合法图像格式时,如XBM。XBM是一种ASCII格式的位图图像,...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    通过这样的途径当你更换使用的数据库时,可以轻松的更改编码以适应这样的变化。PHPLIB就是最常用的可以提供一般事务需要的一系列基库。 - 可扩展性 就像前面说的那样,PHP已经进入了一个高速发展的时期。对于一个...

Global site tag (gtag.js) - Google Analytics