我有一个表格,用户填写歌词信息并上传相册封面。提交的数据将被插入数据库,专辑封面将被移至子文件夹。防止图片上传代码注入
localhost/project-folder/covers
我已经采取了一些预防措施(逃逸,prepated语句)针对SQL注入的形式输入。最近,我了解到,我还需要对文件(图像)上传采取防范措施,以便用户可以上传恶意图像。
例如,在图像元数据中添加HTML,JS或PHP代码或embedding code directly into the image file。由于我没有广泛使用PHP,我不知道这怎么会造成问题,特别是在我的情况下。
我正在做服务器端的表单验证。
本地主机/项目文件夹/歌词/ add.php
<form action="../scripts/lyrics/submit_lyrics.php" id="lyricsForm" method="post" autocomplete="off" enctype="multipart/form-data">
本地主机/项目文件夹/脚本/歌词/ submit_lyrics.php
$form_data = new FormData(["artist", "album", "song", "year", "track_no", "lyrics"], "sssiis");
$file_data = new FileUpload("cover", [
"max_file_size" => 512 * 1024,
"extensions" => ["gif", "jpg", "jpeg", "png"],
"mimes" => ["image/gif", "image/jpeg", "image/png"],
"max_width" => 1024,
"max_height" => 1024,
]);
$cover = new Cover($mysqli, $form_data, $file_data, BASE."covers/");
验证是在做初始化为FormData
和FileUpload
。如果存在无效字段或上传的图像无效,用户将被重定向回表单页面(add.php)并显示相应的警告。
我读过的防止恶意图片上传的方法之一是从上传的图片上创建一个新图片,这就是我在new Cover()
内部所做的。我还调整了上传的图片的大小,以便这种方法有效。我做的是调整大小使用此项功能:
public function new_image($file_data, $new_width, $new_height) {
$img_data = file_get_contents($file_data->tmp_name);
$image_type = $file_data->type;
$img_create = null;
switch ($image_type) {
case IMAGETYPE_GIF:
$img_create = "imagecreatefromgif";
break;
case IMAGETYPE_JPEG:
$img_create = "imagecreatefromjpeg";
break;
case IMAGETYPE_PNG:
$img_create = "imagecreatefrompng";
break;
}
$uploaded_image_resource = $img_create($file_data->tmp_name);
$new_image_resource = imagecreatetruecolor($new_width, $new_height);
imagecopyresampled($new_image_resource, $uploaded_image_resource, 0, 0, 0, 0, $new_width, $new_height, $file_data->image["width"], $file_data->image["height"]);
return $new_image_resource;
}
public function write_to_disk() {
if (isset($this->image["resource"])) {
$destination = $this->target_dir . $this->file_name . ".jpg";
imagejpeg($this->image["resource"], $destination);
imagedestroy($this->image["resource"]);
}
}
这也调整大小删除(我认为)的元数据和/或代码嵌入在图像中(如果有的话)的任何代码,因为我创建一个新的干净的图像。
这足以满足文件上传的保护吗?我错过了什么?还有什么我需要注意的事情吗?