我检查文件扩展名是否上传或未上传.我的方法工作但现在我需要了解,我的方法(pathinfo)是真的吗?另一种更好更快的方式?!谢谢
$filename = $_FILES['video_file']['name'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if ($ext !== 'gif' || $ext !== 'png' || $ext !== 'jpg') {
echo 'error';
}
Run Code Online (Sandbox Code Playgroud)
Bab*_*aba 131
if( $ext !== 'gif'
如果你允许20个不同的扩展,那么使用)可能效率不高
尝试
$allowed = array('gif', 'png', 'jpg');
$filename = $_FILES['video_file']['name'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if (!in_array($ext, $allowed)) {
echo 'error';
}
Run Code Online (Sandbox Code Playgroud)
Rez*_*a S 50
检查文件扩展名不是最佳做法,完成此任务的首选方法是检查文件mime类型.
来自PHP:
<?php
$finfo = finfo_open(FILEINFO_MIME_TYPE); // Return MIME type
foreach (glob("*") as $filename) {
echo finfo_file($finfo, $filename) . "\n";
}
finfo_close($finfo);
?>
Run Code Online (Sandbox Code Playgroud)
上面的示例将输出与您应该检查的类似的内容.
text/html
image/gif
application/vnd.ms-excel
Run Code Online (Sandbox Code Playgroud)
虽然mime类型也可以被欺骗(编辑文件的前几个字节并修改幻数),但它比编辑文件名更难.因此,您永远无法100%确定该文件类型实际上是什么,并且应该小心处理用户上传/通过电子邮件发送的文件.
Jac*_*ack 10
就个人而言,我更喜欢使用preg_match()函数:
if(preg_match("/\.(gif|png|jpg)$/", $filename))
Run Code Online (Sandbox Code Playgroud)
$exts = array('gif', 'png', 'jpg');
if(in_array(end(explode('.', $filename)), $exts)
Run Code Online (Sandbox Code Playgroud)
有了in_array()
,如果你有很多扩展的验证和性能比较的问题可能是有用的.验证文件图像的另一种方法:您可以使用@imagecreatefrom*()
,如果函数失败,则表示图像无效.
例如:
function testimage($path)
{
if(!preg_match("/\.(png|jpg|gif)$/",$path,$ext)) return 0;
$ret = null;
switch($ext)
{
case 'png': $ret = @imagecreatefrompng($path); break;
case 'jpeg': $ret = @imagecreatefromjpeg($path); break;
// ...
default: $ret = 0;
}
return $ret;
}
Run Code Online (Sandbox Code Playgroud)
然后:
$valid = testimage('foo.png');
Run Code Online (Sandbox Code Playgroud)
假设这foo.png
是一个带.png
扩展名的PHP脚本文件,上述功能失败.它可以避免shell更新和LFI等攻击.
pathinfo很酷,但你的代码可以改进:
$filename = $_FILES['video_file']['name'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
$allowed = array('jpg','png','gif');
if( ! in_array( $ext, $allowed ) ) {echo 'error';}
Run Code Online (Sandbox Code Playgroud)
当然,简单地检查文件名的扩展名并不能保证文件类型为有效图像.您可以考虑使用类似getimagesize
验证上传图像文件的功能.