以下是upload_processor.php
中的代码:
include_once 'functions.php';
$name = $_FILES['upload-image']['name'];
$type = $_FILES['upload-image']['type'];
$size = $_FILES['upload-image']['size'];
$temp = $_FILES['upload-image']['tmp_name'];
$error = $_FILES['upload-image']['error'];
img_processor($temp, $error, $size)
这是functions.php
:
function img_processor($img_temp, $img_error, $img_size){
if($img_error===0){
if($img_size < 4194304){
if( $proc_img = @imagecreatefromjpeg($img_temp) ){
imagejpeg($proc_img,'../uploaded/something.jpeg');
} elseif( $proc_img = @imagecreatefrompng($img_temp) ){
imagepng($proc_img,'../uploaded/something.png');
} elseif( $proc_img = @imagecreatefromgif($img_temp) ){
imagegif($proc_img,'../uploaded/something.gif');
} else {
echo("Only JPEGs, PNGs, and GIFs are allowed");
}
if(isset($proc_img)){
echo("upload complete");
}
} else {
echo("Your file was too big. Only images that are 4MB or less are allowed");
}
} else {
echo('Error uploading file! Code '.$img_error);
}
}
基本思路是重新创建图像,然后重命名,以便任何人都无法上传malicious_code.php.jpg
之类的内容。
此代码中有哪些漏洞?有没有更好的方法来保护我的网站免受注入PHP的图像?
答案 0 :(得分:0)
如果出现错误,imagegreatefrom*
将返回false,因此@
运算符在这种情况下实际上并没有做太多。
您可以使用imagecreatefrom*
检查输入文件是否有效,然后调用适当的处理程序,而不是调用exif_imagetype
。我不确定是否存在安全隐患(虽然直觉上听起来可能存在上述代码的安全问题),但性能应该提高,因为每次真值测试失败时都不必创建图像资源。
$handlers = array(
IMAGETYPE_GIF => 'imagecreatefromgif',
IMAGETYPE_JPEG => 'imagecreatefromjpeg',
IMAGETYPE_PNG => 'imagecreatefrompng'
);
$type = exif_imagetype($img_temp);
if(array_key_exists($type,$handlers)){
$proc_img = call_user_func_array($handlers[$type],array($img_temp));
} else {
// do error logic here
}
另一个额外的好处是你可以添加处理程序而不必创建一个巨大的if语句。有关详细信息,请参阅http://www.php.net/manual/en/function.exif-imagetype.php。