这只会允许某些扩展吗?

Dr *_*isk 3 php

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

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

Ben*_*owe 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);
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样称呼它

var_dump(checkExt('test.temp', 'tmp')); // false
var_dump(checkExt('test.temp', array('tmp', 'temp'))); // true
Run Code Online (Sandbox Code Playgroud)

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


Bol*_*ock 5

绕过非常容易,因为更改文件的扩展名不会改变文件的内容.因此,无论如何,.exe重命名为a .jpg仍然是.exe等待运行.您可以将它用于基本检查,但不要仅依靠它来验证文件类型.

这个substr()电话:

substr($name, strlen($name) -3, 3)
Run Code Online (Sandbox Code Playgroud)

更好 更简单地写为:

substr($name, -3)
Run Code Online (Sandbox Code Playgroud)

哪个PHP只是解释为'只接受最后3个字符$name'.

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