网上流传着一种说法,用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 文件上传后缀名与文件类型对照表进行了详细的解释和分析,并对 PHP 文件上传类型判断和限制进行了介绍。了解文件类型和后缀名对于 PHP 文件上传来说非常重要,可以帮助我们更好地判断文件类型和限制文件...
在处理PHP文件上传功能时,经常会遇到需要判断上传文件是否为图片类型的场景。根据给出的文件内容,我们可以详细学习如何在PHP中判断上传文件的图片格式,并给出了详细的实现代码。 首先,通常情况下,我们可以通过...
例如,将文件命名为`evil.php.txt`,服务器可能仅根据`.txt`后缀判断文件类型而忽略真正的`.php`部分,这样就可以绕过扩展名检查。 ##### 0x05: JavaScript文件绕过 一些服务器配置允许JavaScript文件执行,因此...
文件类型通常由文件扩展名(后缀名)来表示,但为了安全起见,仅仅依赖扩展名来判断文件类型是不足够的,还需要通过文件的MIME类型来进行验证。 MIME类型(Multipurpose Internet Mail Extensions,多用途互联网...
4. 严格判断上传文件类型 单纯地依赖文件扩展名来判断文件类型是不安全的,因为文件名可以被轻易更改。为了更安全地获取文件类型,建议使用PHP的`fileinfo`扩展。这个扩展能够通过分析文件的内容来确定其正确的MIME...
在我们的Web应用中,比如用户上传头像,要求是png,jpg,gif格式,接收到图片后会根据图片格式类型做不同的头像切割处理,但个别用户会传一些只更改过文件后缀的非标准图片,比如nowamagic.jpg 强行修改成 nowamagic....
本文介绍的是如何在PHP中实现文件上传功能,并结合文件后缀名的判断和随机命名,旨在提供一个安全而简单的文件上传解决方案。在进行文件上传时,为了防止恶意脚本通过上传不可信任的文件类型造成系统安全问题,进行...
通过上述内容,我们了解到如何在PHP中获取文件的后缀名,并通过与预设的后缀名数组进行比较,实现对上传文件类型的安全检查。这个方法简单有效,能够帮助开发者在实际项目中防范上传恶意文件的风险,保证网站的安全...
在这三种方法中,通过文件后缀来判断MIME类型并不被推荐,因为文件的后缀是可以被用户或者上传者修改的,这样会导致获取到错误的MIME类型。而使用上述方法可以获取到文件实际的内容类型,从而提高程序的准确性和安全...
首先,定义上传文件的允许后缀名是实现文件上传的第一步。PHP脚本中通过数组`$allowExt`设置了允许上传的文件类型,如图片(.jpg, .png, .gif等)、文档(.pdf, .doc等)和其他文件类型(.zip, .rar等)。限制文件类型是...
头信息验证比后缀名验证更可靠,它会读取文件的头部字节来判断文件类型。PHP中的`finfo_file`函数或`mime_content_type`函数可以实现这个功能。这些函数会检测文件的MIME类型,确保它是图片类型。以下是一个例子: ...
在实际应用中,这些函数和方法的组合使用可以实现各种复杂的文件管理和操作,比如文件上传、下载、移动、重命名、权限设置等。理解并熟练运用这些基础功能,是成为一名合格的PHP开发者的重要一步。在编写代码时,应...
本文介绍了一个功能强大的PHP文件上传类,该类可以简化文件上传的过程,并提供了一些基本的功能验证,例如检查文件大小、文件类型、文件是否存在以及文件重名处理等。 首先,类中定义了一些私有变量来存储文件上传...
对于文件上传的处理,PHP主要通过 $_FILES 数组中的信息来判断上传的文件是否成功,并且是否符合预期的要求。 在实例中,我们看到一个名为 FileUpload 的类被定义用来处理上传文件。这个类包含了文件上传处理的全部...
- **`filemtime()`**:获取文件的最后修改时间(以UNIX时间戳形式返回)。参数为文件路径。 - **`fileatime()`**:获取文件的最后访问时间(以UNIX时间戳形式返回)。参数为文件路径。 - **`stat()`**:用于获取文件...
接下来,WAF检查文件是否存在敏感字符,以及通过`image_type()`函数判断文件类型。这一步可以通过在HTTP请求中修改文件头信息来规避,特别是当文件头被识别为合法图像格式时,如XBM。XBM是一种ASCII格式的位图图像,...
通过这样的途径当你更换使用的数据库时,可以轻松的更改编码以适应这样的变化。PHPLIB就是最常用的可以提供一般事务需要的一系列基库。 - 可扩展性 就像前面说的那样,PHP已经进入了一个高速发展的时期。对于一个...