这只会允许某些扩展吗?

时间:2010-06-17 23:13:51

标签: php

我发现这个代码段只会允许某些文件类型。它会工作吗,有人可以绕过它来上传他们想要的文件类型吗?并且有人可以解释子部分,我不知道它是如何工作的。

<?php
function CheckExt($filename, $ext) {
    $name = strtolower($filename);
    if(substr($name, strlen($name) -3, 3) == $ext)
        return true;
    else
        return false;
}
?>

4 个答案:

答案 0 :(得分:7)

检查扩展程序的更好方法

function checkExt($filename, $ext)
{
  $fnExt = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
  if(!is_array($ext)) {
    $ext = (array)$ext;
  }
  $ext = array_map('strtolower', $ext);
  return in_array($fnExt, $ext);
}

然后您可以将其称为

var_dump(checkExt('test.temp', 'tmp')); // false
var_dump(checkExt('test.temp', array('tmp', 'temp'))); // true

避免使用substr,因为扩展长度未知(您也可以使用substr&amp; strrpos,但php为您提供此功能)

答案 1 :(得分:5)

通过更改文件扩展名不会更改文件内容,可以轻松绕过。因此,重命名为.exe的{​​{1}}仍然是.jpg,无论如何都要等待。您可以将它用于基本检查,但不要仅依靠它来验证文件类型。

substr()来电:

.exe

更好更简单地写为:

substr($name, strlen($name) -3, 3)

哪个PHP只是解释为'仅使用substr($name, -3) '的最后3 个字符。

编辑:本身并不是更好因为文件扩展名不一定必须是3个字符。它们可能是2,它们可能是4,5,甚至10。这就是为什么我说,检查文件扩展名不是很可靠。

答案 2 :(得分:1)

我更喜欢白名单 Mimetypes我想允许使用的内容

 $mimesGeneral = array(
        'txt'=>'text/plain',
        'doc'=>'application/msword',
        'pdf'=>'application/pdf',
        'xls'=>'application/x-excel',
        'xls'=>'application/excel',
        'xls'=>'application/vnd.ms-excel',
        'rtf'=>'application/rtf',
        'zip'=>'application/zip'

        );
$success = false;
foreach($allowedMimes as $key=>$value){

            if($_FILES['uploaded_file']['type'] == $value){

                return true;
            }
        }

我使用黑名单后缀,例如'php','pl','exe'等...

答案 3 :(得分:0)

人们仍然可以上传他们想要的任何东西;他们只需要给文件一个特定的扩展名。

对于substr,请参阅manual