PHP:x27的起源是什么;类型';美元文件中的索引?

PHP:x27的起源是什么;类型';美元文件中的索引?,php,security,apache,file-upload,webserver,Php,Security,Apache,File Upload,Webserver,为了验证文件上载中允许的mime类型,我通常依赖于扩展名,但由于该扩展名或并不总是可用,我想到使用与superglobal上每个文件关联的类型索引 所以我的问题是,这个指数来自哪里?我怀疑它要么来自浏览器(如果是伪造的),要么最有可能来自web服务器(或PHP)——如果是这样的话:它只是mime类型映射的扩展,还是真实的?它是浏览器通过解释文件扩展名提供的文件的mime类型。所以你是对的,这可以由客户伪造。这不是你问题的答案,但已经提供了答案 首先,我不会用它来验证你的文件,它不是100%可靠的

为了验证文件上载中允许的mime类型,我通常依赖于扩展名,但由于该扩展名或并不总是可用,我想到使用与superglobal上每个文件关联的类型
索引


所以我的问题是,这个指数来自哪里?我怀疑它要么来自浏览器(如果是伪造的),要么最有可能来自web服务器(或PHP)——如果是这样的话:它只是mime类型映射的扩展,还是真实的?它是浏览器通过解释文件扩展名提供的文件的mime类型。所以你是对的,这可以由客户伪造。

这不是你问题的答案,但已经提供了答案

首先,我不会用它来验证你的文件,它不是100%可靠的,相反,我会用文件函数和一些二进制转换函数扫描文件

听起来可能很复杂,但其实没那么难

每个文件都应该有一组神奇的数字,允许您通过读取前4/8/16字节的数据来确定文件类型

PDF文件以“%PDF”开头(十六进制25 50 44 46)

您还必须实现其他检查,例如:MicrosoftOfficePPT/DOC/XLS都具有相同的字节码,因此您还需要验证扩展


记住安全第一。

它由客户端在构造POST请求时定义。文件只能显示为,如下所示:

--BoUnDaRy02984
Content-Disposition: form-data; name="textfield1"
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Joe owes =80100.
 --BoUnDaRy02984
Content-Disposition: form-data; name="file2"; filename="C:\tmp\file.doc"
Content-Type: application/ms-word
Content-Transfer-Encoding: base64
Content-Length: 32

VGhpcyB3b3VsZCBiZSB0aGUgdGV4dAo=
 --BoUnDaRy02984

PHP不会解释multipart/的所有可能变体,但它会通过存在
filename=
属性来检测文件上载,并使用
内容类型:
字段逐字记录$_文件[*][Type]。

+1请参见。@lonesomeday:谢谢,我正在查找该页面。很高兴知道这一点。例如,如果一个
.php
文件包含以下内容,会发生什么情况:
%PDF
?Alix,它不是这样工作的,数据是二进制的,并写入文件头,没有作为内容可见。