我编写php代码以允许用户提交图像并将其上传到服务器。我得到它的工作,服务器收到图像。但似乎服务器甚至接受.avi和.flv文件。我写if / else语句来检查文件是否是图像,但为什么它不起作用?谢谢
这是我的php代码
$tmpPath = $_FILES["image"]["tmp_name"];
$movedPath = "submit-img/" . $_POST["category"] . "/" . $_FILES["image"]["name"];
$fullURL = parse_url($_SERVER['HTTP_REFERER']);
$query = explode("&", $fullURL["query"]); //only choose first query
$prevPage = "gallery.php" . "?" . $query[0];
//I get the file type here
$fileType = strpos($_FILES["image"]["type"], "image/");
//if its not an image then redirect to the previous page and send a message
if ($fileType === false || ($_FILES["image"]["size"]) == 0 || $_FILES["image"]["size"]/1024 > 5000){
$prevPage = $prevPage . "&imgSubmit=none#imgSubmitForm";
header("Location: " . $prevPage);
}else if ($_FILES["image"]["size"] > 0){ //if file is an image
if (!is_file($movedPath)){
move_uploaded_file($tmpPath, $movedPath);
}else{
while (is_file($movedPath)){
$extension = strrchr($movedPath, ".");
$movedPath = str_replace($extension, "", $movedPath) . "1" . $extension;
}
move_uploaded_file($tmpPath, $movedPath);
}
$prevPage = $prevPage . "&imgSubmit=submitted#imgSubmitForm";
header("Location: " . $prevPage);
}
答案 0 :(得分:0)
}else if ($_FILES["image"]["size"] > 0){ //if file is an image
对这一行的评论从根本上是误导性的。 size
中的$_FILES
键是文件的大小(以字节为单位);它与“文件是图像”无关。 (特别是,不图像的物理尺寸。)
如果您需要测试文件是否是图像,最好的办法是使用getimagesize
功能。如果图像是PHP识别的图像类型,则此函数将返回图像的大小;如果图像看起来不是图像,则返回零。
请勿使用type
数组的$_FILES
字段来确定文件是否为图像。此字段由浏览器填充,而不是由服务器填充,并且可能包含误导性和/或不完整的错误信息。
答案 1 :(得分:0)
不是答案,但您的代码非常容易受到攻击:
1)您没有检查上传成功,并认为DID成功。在执行任何操作之前,请务必检查上传失败:
if ($_FILES['image']['error'] !== UPLOAD_ERR_OK) {
die("Upload failed with error code " . $_FILES['image']['error']);
}
2)您正在使用['type']
字段进行验证。这是一个用户提供的值,并且不可信任。恶意用户可以轻易地操纵该值来说image/jpeg
,但仍然可以上传nastyvirus.exe
。
3)您正在使用['name']
字段存储在您的服务器上。这也是用户提供的数据,并且可以简单地操作以包括路径信息,例如, ../../../../../../../etc/passwd
。由于您盲目地使用它,因此您允许恶意用户在服务器上的任何文件上涂鸦,网络服务器可以访问该文件。