这是否抓取路径的文件扩展名?它构成了一个文件上传脚本的一部分,它继续检查$ end是“jpg”而不是别的。给我下面的内容可以绕过吗?PHP - 抓取路径的文件扩展名
$temp = strlen($path);
$end = $path[$temp-3] . $path[$temp-2] . $path[$temp-1];
这是否抓取路径的文件扩展名?它构成了一个文件上传脚本的一部分,它继续检查$ end是“jpg”而不是别的。给我下面的内容可以绕过吗?PHP - 抓取路径的文件扩展名
$temp = strlen($path);
$end = $path[$temp-3] . $path[$temp-2] . $path[$temp-1];
看一看: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.
我无法更改代码,但我想确保它是安全的。 – user1166981
那么,给出一个答案:不是。扩展只是为了程序的兼容性,所以你的电脑会知道如何处理它。这不是100%安全。如果文件末尾显示“jpg”,则不能依赖图像这一事实。 – Jelmer
本文给出了一些可能发生的很好的例子。 http://www.rafayhackingarticles.net/2012/01/how-websites-get-hacked-with-fileupload.html – Jelmer
试试这个,
$ext = pathinfo('abc.jpeg' ,PATHINFO_EXTENSION);
我无法改变的代码,但我想,以确保它是安全的 – user1166981
它会很好地工作。有些代码会搜索最后3个字符(但有些时候我们有4个字符长的分机),有些则会搜索“。”。点(有些时候我们可以有像“my.persocal.xls”这样的文件名,所以它有两个点),在上述所有情况下,这将完美工作。 –
所以我贴的代码不能被滥用上传不是jpeg的东西? – user1166981
如果你想确保有效的图像上传,不依赖于结尾的文件,它可以被篡改。您可以使用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;
}
感谢您的信息,但我正在评估现有的代码,因为我无法更改它 – user1166981
要检查文件扩展名,您的代码是安全的。不过,正如上面所写的那样,它并不确定文件是否真的是图像。 –
它给出了名称的最后三个字符,但如果名称不是三个人物长,它可能不会做好事。所以至少检查$ temp> 3(你可能想要超过3,正确) –