2010-06-17 180 views
3

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

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

这将是一个简写该函数:'返回substr(strtolower($文件名),-3)== $ ext;' – 2010-06-17 23:17:07

回答

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); 
} 

然后,您可以使用SUBSTR作为扩展长度未知称呼它

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

避免(你可以使用substr当作& strrpos很好,但PHP为您提供此功能)

0

人们仍然可以上传任何他们想要的东西;他们只需要给文件一个特定的扩展名。对于substr,请参阅manual

5

这是很容易绕过,因为改变文件的扩展名不会改变文件的内容。所以.exe改名为.jpg仍然是.exe无论如何等待运行。您可以将其用于基本检查,但不要单靠它来验证文件类型。

substr()电话:

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

更好更简单地写为:

substr($name, -3) 

的PHP只是解释为“只拿最后3级$name人物。

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

+0

好的谢谢,但我的意思是我不希望人们上传贝壳,如果他们改变它的图像扩展名,它会无法执行的PHP,或者他们可以吗? – 2010-06-17 23:30:34

+1

@Dr Hydralisk当允许任何用户上传文件时,您应该将这些文件的权限设置为不可执行! – 2010-06-17 23:32:04

+0

@Dr Hydralisk:他们可能无法做到,但我认为最好是安全的。没有任何一点保留恶意文件。 – BoltClock 2010-06-17 23:33:37

1

我更喜欢白名单我想要的Mimetypes使用流沿着我用这个有黑名单后缀如“PHP”的

$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; 
      } 
     } 

线的东西,“PL”,“EXE”等等......

+0

mimetypes也可以是伪造的以及扩展名。 – 2010-06-18 08:16:59

+0

不知道 - >除了将数据附加到图像上,这就是为什么我总是通过GD运行用户输入并创建新图像而不是使用原始图像的原因。 我想这是另一个领域,然后查看任何允许用户上传的东西。 – niggles 2010-06-21 05:46:06