【发布时间】:2016-12-20 20:52:39
【问题描述】:
我有一个表单,用户填写歌词信息并上传专辑封面。提交的数据将被插入数据库,专辑封面将被移动到子文件夹。
localhost/project-folder/covers
我已经针对表单输入的 SQL 注入采取了一些预防措施(转义、准备好的语句)。最近了解到,文件(图片)上传也需要注意,用户可以上传恶意图片。
例如,在图像元数据中添加 HTML、JS 或 PHP 代码,或 embedding code directly into the image file。由于我没有广泛使用 PHP,所以我不知道这会带来什么问题,尤其是在我的情况下。
我正在服务器端进行表单验证。
localhost/project-folder/lyrics/add.php
<form action="../scripts/lyrics/submit_lyrics.php" id="lyricsForm" method="post" autocomplete="off" enctype="multipart/form-data">
localhost/project-folder/scripts/lyrics/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"]);
}
}
此调整大小还会删除(我认为)元数据中的任何代码和/或图像中嵌入的代码(如果有的话),因为我正在创建一个新的干净图像。
这足以保护文件上传吗?我错过了什么吗?还有其他我需要注意的事情吗?
【问题讨论】:
标签: php html upload xss image-uploading