Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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_Types_Upload_Explode - Fatal编程技术网

PHP-检查文件扩展名以及确定真实文件类型的最佳方法是什么?

PHP-检查文件扩展名以及确定真实文件类型的最佳方法是什么?,php,file,types,upload,explode,Php,File,Types,Upload,Explode,我想知道$\u FILES[“file”][“type”]和end(explode(“.”,$name)之间有什么区别,以及确定检索到的文件类型是否确实是文件的正确内容的适当方法 例如,对名为“image.exe”并重命名为“image.jpg”的文件进行排序的最佳方法是什么 我看到很多关于MIME类型的讨论,但似乎该方法已被弃用。$\u文件[“file”][“type”]是由用户的浏览器提供的,因此对安全性毫无用处 正如您所注意到的,文件扩展名也很容易伪造 如果要确保图像是图像,最简单的方法是

我想知道
$\u FILES[“file”][“type”]
end(explode(“.”,$name)
之间有什么区别,以及确定检索到的文件类型是否确实是文件的正确内容的适当方法

例如,对名为“image.exe”并重命名为“image.jpg”的文件进行排序的最佳方法是什么

我看到很多关于MIME类型的讨论,但似乎该方法已被弃用。

$\u文件[“file”][“type”]
是由用户的浏览器提供的,因此对安全性毫无用处

正如您所注意到的,文件扩展名也很容易伪造

如果要确保图像是图像,最简单的方法是在其上运行

如果您想超级确定并删除图像中可能嵌入的任何和所有元数据,请使用GD将图像复制到一个空画布上(但要为可能的轻微质量损失做好准备)

对于其他文件类型,显然有now。它使用底层操作系统的mime.magic文件,通过检查文件中的某些特征和“头字节”来估计文件的类型。

$\u文件[“文件”][“类型”]
由用户的浏览器提供,因此对安全性毫无用处

正如您所注意到的,文件扩展名也很容易伪造

如果要确保图像是图像,最简单的方法是在其上运行

如果您想超级确定并删除图像中可能嵌入的任何和所有元数据,请使用GD将图像复制到一个空画布上(但要为可能的轻微质量损失做好准备)


对于其他文件类型,显然有now。它使用底层操作系统的mime.magic文件,通过检查文件中的某些特征和“头字节”来估计文件的类型。

如果您只是处理图像文件,则getimagesize()应执行以下操作:


它将返回图像类型作为它返回的数组的元素,如果文件不是有效的图像,则返回FALSE。

如果只是处理图像文件,则getimagesize()应执行以下操作:


它将返回图像类型作为其返回的数组元素,如果文件不是有效图像,则返回FALSE。

这是读取扩展名的正确方法:

$ext = pathinfo($name, PATHINFO_EXTENSION);
检查某物是否为图像的正确方法是尝试使用图像工具(如或)读取它。GD更容易,但imagemagick更擅长处理大图像,如从1200万像素照相机上传的图像

如果你担心jpg真的是一个exe,那么安全处理它的唯一方法就是将它作为jpg读取,然后尝试创建一个新的jpg(通常同时调整它的大小)。Gmail通过图像附件来实现这一点

还要注意,一个真正的jpeg可能有某种漏洞,因此即使它是一个图像,也不能安全地将其传递给用户。您确实应该调整它的大小,以创建一个新的“安全”jpeg,然后将其提供给用户。如果您愿意,您可以使一个新jpg具有相同的大小,但将原始数据传递给其他用户是危险的


我甚至不允许您网站的管理员用户访问随机internet用户上传的jpg。它可以用来入侵管理员的PC。

这是读取扩展名的正确方法:

$ext = pathinfo($name, PATHINFO_EXTENSION);
检查某物是否为图像的正确方法是尝试使用图像工具(如或)读取它。GD更容易,但imagemagick更擅长处理大图像,如从1200万像素照相机上传的图像

如果你担心jpg真的是一个exe,那么安全处理它的唯一方法就是将它作为jpg读取,然后尝试创建一个新的jpg(通常同时调整它的大小)。Gmail通过图像附件来实现这一点

还要注意,一个真正的jpeg可能有某种漏洞,因此即使它是一个图像,也不能安全地将其传递给用户。您确实应该调整它的大小,以创建一个新的“安全”jpeg,然后将其提供给用户。如果您愿意,您可以使一个新jpg具有相同的大小,但将原始数据传递给其他用户是危险的


我甚至不允许你网站的管理员用户访问随机互联网用户上传的jpg。它可能被用来侵入管理员的电脑。

使用end(explode(“.”,$name)时要小心双重扩展。 如果给定两个映射到相同元信息的扩展名,Apache将读取最右边的扩展名。例如file.gif.html将作为html文件关联

如上所述,客户端提供的浏览器信息作为安全措施是无用的

最佳匹配-getimagesize();
与其他方法一样,也有解决方法。恶意代码注释可能会添加到图片中,从而绕过getimagesize()检查,因为标题仍然有效

使用end(explode(“.”,$name)时要小心双扩展名。 如果给定两个映射到相同元信息的扩展名,Apache将读取最右边的扩展名。例如file.gif.html将作为html文件关联

如上所述,客户端提供的浏览器信息作为安全措施是无用的

最佳匹配-getimagesize();
与其他方法一样,有一些方法可以绕过getimagesize()将恶意代码注释添加到图片中检查,因为标题仍然有效

您也可以只替换文件内容的前60个字符。jpg只有3个可能的值,gif只有2个,png只有1个。这就是fileinfo所能做的,如果您担心安全性,那么它根本就不安全。@Abhi该检查程序很好。re security-我假设您指的是exp你提到的loits-我不确定这些是否只是理论上的可能性。目前在任何大众市场的软件中是否存在任何已知的图像文件漏洞?毕竟,对文件重新编码总是会带来质量损失。“是否存在任何已知的图像文件漏洞?”是的,t