web上存漏洞及原理分析、防范方法(文件名检测漏洞)

web上存漏洞及原理分析、防范方法(文件名检测漏洞)

我们通过前篇:<web上存漏洞及原理分析、防范方法(安全文件上存方法) >,已经知道后端获取服务器变量,很多来自客户端传入的。跟普通的get,post没有什么不同。下面我们看看,常见出现漏洞代码。

1、检测文件类型,并且用用户上存文件名保存

复制代码 代码如下:

if(isset($_FILES['img']))

{

$file = save_file($_FILES['img']);

if($file===false) exit('上存失败!');

echo "上存成功!",$file;

}

function check_file($img)

{

///读取文件

if($img['error']>0) return false;

$tmpfile = $img['tmp_name'];

$filename = $img['name'];

///读取文件扩展名

$len=strrpos($filename,".");

if($len===false) return false;

//得到扩展名

$ext = strtolower(substr($filename,$len+1));

if(!in_array($ext,array('jpg','jpeg','png'))) return false;

return true;

}

function save_file($img)

{

if(!check_file($img)) return false;

//格式检测ok,准备移动数据

$filename = $img['name'];

$newfile = "upload/" .$filename;

if(!move_uploaded_file($img["tmp_name"],$newfile)) return false;

return $newfile;

}

?>

以 上代码,对输入类型也做了判断,看了没有问题。但是问题,确恰恰出现在对获取的用户名变量检测上面。直接获取传入用户名,然后存为文件。 有朋友会说:这些文件名都是我电脑里面存在的,文件名格式都受限于操作系统对文件名定义。 但是,需要注意是,对于$_FILES里面获取变量,是直接来自http request请求。它跟普通获取其它get,post变量一样。 因此,别有用心的人,往往会自己模拟浏览器,给服务器发送一个特殊文件名。然后,让存文件时候,能够正常保存为自己格式。

前些年,”