Php 上传mp3、文档、ppt、sql、zip、tar、rar文件

Php 上传mp3、文档、ppt、sql、zip、tar、rar文件,php,Php,我想给我的用户在我的在线存储站点上传所有类型文件的自由。我只知道如何上传图像文件,例如: //other code $_FILES["file"]["type"] == "image/jpeg" $_FILES["file"]["type"] == "image/jpg" $_FILES["file"]["type"] == "image/pjpeg" $_FILES["file"]["type"] == "image/x-png" $_FILES["file"]["type"]

我想给我的用户在我的在线存储站点上传所有类型文件的自由。我只知道如何上传图像文件,例如:

//other code   
 $_FILES["file"]["type"] == "image/jpeg"
 $_FILES["file"]["type"] == "image/jpg"
 $_FILES["file"]["type"] == "image/pjpeg"
 $_FILES["file"]["type"] == "image/x-png"
 $_FILES["file"]["type"] == "image/png"
//other code
使用ebove代码,我可以将给定的扩展文件上传到我的站点。但是我想上传.mp3.doc.ppt.docx。sql和更多可能的文件。要做到这一点,我应该在下面的“问号”中添加什么:

请告诉我是否有任何文件扩展名的列表,我应该写些什么来上传要求的文件

---谢谢


你需要做一些搜索,以确认这些正是你正在寻找的。我确信它无处不在。

$\u FILE['FILE']['Type']
中提供的MIME类型是客户端提供的信息,可以伪造。不要相信它。它也可能因机器而异,正如您自己所看到的,每个扩展都没有一个MIME描述,因此依赖它来做出任何类型的决定可能会非常令人沮丧

有人可以给你发一个
music.php
,说它是一个
音频/mp3
,然后把它保存在你的网站文件夹中,你就给了他们破坏整个服务器的方法。不要这样做

相反,使用文件扩展名来确定其类型。您还可以列出一个数组中所有允许的扩展名,只需检查此数组中是否存在文件扩展名

$allowed_extensions = array(
    'mp3', 'mp4', 'doc', 'zip', 'rar',
    'docx', 'ppt', 'pps', 'pptx' // ...
);
if (!in_array(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION), $allowed_extensions))
    die("You can't upload this.");
或者,您可以取而代之的是禁止危险的文件扩展名,并允许所有其他内容,考虑到您希望允许“任何类型的文件”,这将更容易做到


还要注意文件名。
$\u FILES['file']['name']
中提供的文件名应仅为文件基名称,但此信息同样由用户提供,可以包括完整路径或相对路径,以使脚本将其保存在不应保存的位置。始终使用
basename($\u FILES['file']['name'])
确保保存文件时使用的是文件基名称。

旁注:不应使用这些地雷类型的“保护”,它很容易被绕过,因此攻击者可以上载PHP文件。。因为浏览器(HTTP协议)告诉(读取提示)服务器用户上传的文件类型,以添加到@RaymondNijland所说的内容中。如果您想获得关于文件类型的更明确信息,还可以考虑使用
SplFileInfo
。哦,为了帮助回答最初的问题,我建议用谷歌搜索这些文件类型的MIME类型。这是很容易获得的信息。通过互联网搜索,可以很容易地获得有问题的信息。在这样一个非权威的网站上重复这些信息没有什么价值。从来没有在
SplFileInfo
对象后面查看过PHP的C/C++源代码,所以我不知道如何保存它。。。但最安全的选择是在二进制级别解析文件。。Mp3文件格式->(Mp3的MIME类型也在那里)或在asii上解析文件,例如sql文件,非常感谢。感谢您告诉我可以以音频/mp3格式发送music.php,我不知道这一点。当然是危险的!使用basename听起来很安全。是的,我接受你的回答和建议。现在为了安全起见,我要更改我的代码。:)@Havenardhanks,我决定改变我的代码,这样我就不再需要这个了,但知道方法还是很好的……)@贾斯廷
mp3 => ($_FILES["file"]["type"] == "audio/mp3")
pdf => ($_FILES["file"]["type"] == "application/pdf")
zip => ($_FILES["file"]["type"] == "application/zip")
|| ($_FILES["file"]["type"] == "application/x-zip-compressed")
|| ($_FILES["file"]["type"] == "multipart/x-zip")
|| ($_FILES["file"]["type"] == "application/x-compressed") // one of those depending on the zip file.
sql=> ($_FILES["file"]["type"] == "application/octet-stream")
ppt=> ($_FILES["file"]["type"] == "application/vnd.ms-powerpoint")
pptx=> ($_FILES["file"]["type"] == "application/vnd.openxmlformats-officedocument.presentationml.presentation")

docx=> ($_FILES["file"]["type"] == "application/vnd.openxmlformats-officedocument.wordprocessingml.document")
$allowed_extensions = array(
    'mp3', 'mp4', 'doc', 'zip', 'rar',
    'docx', 'ppt', 'pps', 'pptx' // ...
);
if (!in_array(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION), $allowed_extensions))
    die("You can't upload this.");
$disallowed_extensions = array('exe', 'scr', 'cpl', 'bat', 'php', 'htaccess');
if (in_array(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION), $disallowed_extensions))
    die("You can't upload this.");