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