上传表单中的php检查文件扩展名

BBK*_*ing 48 php file-upload

我检查文件扩展名是否上传或未上传.我的方法工作但现在我需要了解,我的方法(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)

  • 此过程并不安全。用户可以将危险文件重命名为 jpg 并将其保存到服务器。为了确保只上传可以按预期处理的图片,我建议检查 MimeType。(请参阅下面的其他解决方案:/sf/answers/731930461/) (2认同)

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%确定该文件类型实际上是什么,并且应该小心处理用户上传/通过电子邮件发送的文件.

  • 我几乎怀疑有一种方法可以获得REAL文件扩展名.到处都有"分析文件名"的答案,这是最糟糕的方式......非常感谢这个答案! (3认同)
  • @PrafullaKumarSahu你可以在这里找到你问题的详细答案:http://stackoverflow.com/a/8028436/196917 (3认同)
  • 这个答案应该在顶部,有人很容易更改文件扩展名! (2认同)
  • 我认为 BBKing 也在寻找一种方法来防止上传 webshel​​l。在 HTTP 请求中可以轻松更改 MIME 类型。检查扩展名是一种更好的(虽然不是理想的)方法,因为没有正确扩展名的文件将无法执行。检查 OWASP 资源: • https://www.owasp.org/index.php/Unrestricted_File_Upload (2认同)

Jac*_*ack 10

就个人而言,我更喜欢使用preg_match()函数:

if(preg_match("/\.(gif|png|jpg)$/", $filename))
Run Code Online (Sandbox Code Playgroud)

或者in_array()

$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等攻击.


Con*_*hol 5

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验证上传图像文件的功能.