2012-12-24 28 views
0

这是否抓取路径的文件扩展名?它构成了一个文件上传脚本的一部分,它继续检查$ end是“jpg”而不是别的。给我下面的内容可以绕过吗?PHP - 抓取路径的文件扩展名

$temp = strlen($path); 
$end = $path[$temp-3] . $path[$temp-2] . $path[$temp-1]; 
+0

它给出了名称的最后三个字符,但如果名称不是三个人物长,它可能不会做好事。所以至少检查$ temp> 3(你可能想要超过3,正确) –

回答

6

看一看:http://php.net/manual/en/function.pathinfo.php

混合PATHINFO(字符串$ PATH [摘要$选项= PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME])

<?php 
$path_parts = pathinfo('/www/htdocs/inc/lib.inc.php'); 

echo $path_parts['dirname'], "\n"; # returns: /www/htdocs/inc 
echo $path_parts['basename'], "\n"; # returns: lib.inc.php 
echo $path_parts['extension'], "\n"; # returns: php 
echo $path_parts['filename'], "\n"; # returns: lib.inc | since PHP 5.2.0 
?> 

或者你可以设置标志只获得扩展名,如下所示:

$extension = pathinfo('/www/htdocs/inc/lib.inc.php', PATHINFO_EXTENSION); 
echo $extension; # prints `php` to the screen. 
+0

我无法更改代码,但我想确保它是安全的。 – user1166981

+0

那么,给出一个答案:不是。扩展只是为了程序的兼容性,所以你的电脑会知道如何处理它。这不是100%安全。如果文件末尾显示“jpg”,则不能依赖图像这一事实。 – Jelmer

+0

本文给出了一些可能发生的很好的例子。 http://www.rafayhackingarticles.net/2012/01/how-websites-get-hacked-with-fileupload.html – Jelmer

1

试试这个,

$ext = pathinfo('abc.jpeg' ,PATHINFO_EXTENSION); 
+0

我无法改变的代码,但我想,以确保它是安全的 – user1166981

+0

它会很好地工作。有些代码会搜索最后3个字符(但有些时候我们有4个字符长的分机),有些则会搜索“。”。点(有些时候我们可以有像“my.persocal.xls”这样的文件名,所以它有两个点),在上述所有情况下,这将完美工作。 –

+0

所以我贴的代码不能被滥用上传不是jpeg的东西? – user1166981

2

如果你想确保有效的图像上传,不依赖于结尾的文件,它可以被篡改。您可以使用PHP图像函数来确保文件确实是图像,例如:

function is_image($path) { 
    $a = getimagesize($path); 
    $image_type = $a[2]; 

    if(in_array($image_type , array(IMAGETYPE_GIF , IMAGETYPE_JPEG ,IMAGETYPE_PNG , IMAGETYPE_BMP))) 
    { 
     return true; 
    } 
    return false; 
} 
+0

感谢您的信息,但我正在评估现有的代码,因为我无法更改它 – user1166981

+1

要检查文件扩展名,您的代码是安全的。不过,正如上面所写的那样,它并不确定文件是否真的是图像。 –

相关问题