PHP文件上载类型检查

PHP文件上载类型检查,php,Php,好的,这是我上传文件的代码 $ext_whitelist = array('pdf','doc','doc','mkv','mp4','mpg','mpeg','avi','flv','wma','ogg'); if(in_array($ext, $ext_whitelist)) { $uniqid_file = uniqid('', true)."_".$file['name']; $lokacija = $folder . "/" . $uniqid_file;

好的,这是我上传文件的代码

 $ext_whitelist = array('pdf','doc','doc','mkv','mp4','mpg','mpeg','avi','flv','wma','ogg');

 if(in_array($ext, $ext_whitelist))
 {
     $uniqid_file = uniqid('', true)."_".$file['name'];
     $lokacija = $folder . "/" . $uniqid_file;
     $encoded_uniqid_file = base64_encode($uniqid_file);
     move_uploaded_file($file['tmp_name'], $lokacija);
     $base_url= base_url("forms/fdownload/$encoded_uniqid_file/$path");
     $form_data[$key] = "<a href=".$base_url.">$uniqid_file </a>";
 }
$ext_whitelist=array('pdf','doc','doc','mkv','mp4','mpg','mpeg','avi','flv','wma','ogg');
if(在数组中($ext,$ext\u白名单))
{
$uniqid_file=uniqid(“”,true)。“..$file['name'];
$lokacija=$folder.“/”$uniqid_文件;
$encoded_uniqid_file=base64_encode($uniqid_file);
移动上传的文件($file['tmp\u name',$lokacija);
$base_url=base_url(“forms/fdownload/$encoded_uniqid_file/$path”);
$form_data[$key]=“”;
}
这检查文件扩展名,所以很容易一些人可以重命名文件,有人可以帮我检查文件类型正确吗?

您可以使用

perl文件mimeinfo

例如:


我将写多一点作为回答,而不是评论

如果您想知道文件的类型,Mimetype检查是一件好事,但是如果您想在上载时允许/拒绝文件,那么Mimetype检查是不安全的,因为很容易伪造Mimetype。 只需尝试一下,您可以使用代理更改它,或者您可以创建一个简单的图像,然后在末尾添加一些php代码并将其重命名为.php。如果只检查mimetype,则可以上载此.php文件并在服务器上运行它

如果你上传了包含php代码的.jpg,没关系,服务器不会将其推送到php解析器中。(更改默认配置时除外。(Apache:AddType,nginx:AddHandler)

有一些“安全”的方法来检查上传的文件:

1.检查扩展名并将其与白名单进行比较。 这就是问题中的例子,但我想写一个完整的解决方案。(一个常见的错误是只检查
之后的第一个想法,因为可能有类似于:something.txt.php的文件名,所以总是检查最后一个后缀。)

如果您使用这样的东西,请小心,不要允许像.php这样的扩展和服务器配置中的任何东西

2.重命名文件并删除扩展名。 这是另一种很好的方法,但可能您希望保留原始文件名、扩展名和mimetype。您可以将它们存储在数据库中

对于这个解决方案,只需获取原始文件名,添加一些随机数据(因为如果你上传到一个文件夹中,并试图上传某物.jpg 2次,这将是一个坏主意),然后存储这个文件名。 例如:

$newName = sha1($fileName.time());
move_uploaded_file($file['tmp_name'], $uploadPath . $newName);

因为文件没有扩展名,服务器不会尝试运行它。(但是,如果它是一个图像,它将在浏览器中工作,因为浏览器使用mimetype来确定类型,而我们没有更改它。)

您可以查看mime\u type您可以为其编写吗me@teeyo:检查扩展名的最简单方法。例如:$ext 7=array\u pop(分解(“.”,$fileName));然后将其与白名单进行比较。您是否可以上载.txt、.jpg、.doc等格式的脚本并不重要,因为服务器配置为使用php解析器解析文件,如果它们具有扩展名,如:.php、.php5等。如果您不允许这些扩展名,则很好。@teeyo:另一种完全重命名文件并删除扩展名的好方法。例如创建散列(md5、sha1等)对于文件名,如果需要,请将原始名称、扩展名、mimetype存储在数据库中。您可以,但很容易更改。您可以上载带有音频/视频mime类型的.php文件。因此,请小心并检查扩展名。您能帮我形成示例以检查是视频文件还是doc docx或pdf格式。这是上传视频的检查或者,如果原始代码是好的,请使用它来允许上载,然后使用此mimetype检查来获取文件类型。请使用
echo$mimetype;
来检查文件类型。它会给您一个想法,并将其与if语句一起使用。@Gerifield Yes您是对的。它已经在讨论中处理过了。
$ext = array_pop(explode(".", $fileName));
$whitelist = array('pdf','doc','doc','mkv','mp4','mpg','mpeg','avi','flv','wma','ogg');

if (in_array($ext, $whitelist) {
  //OK the extension is good, handle the upload.
} else {
  //Wrong type, add error message.
}
$newName = sha1($fileName.time());
move_uploaded_file($file['tmp_name'], $uploadPath . $newName);