我有一个脚本,可以上传图像,将其插入数据库,并显示在主页上。
然而,它是不安全的,我如何使这个脚本更安全,并确保它只允许jpeg/jpg文件。
UploadController.php
public function upload_image($filename, $image_name)
{
$this->uploadfile = $this->directory . basename($filename);
try{
$sql = "INSERT INTO images (img, image_name) VALUES (?, ?)";
$stmt = $this->connect->prepare($sql)->execute([$filename, $image_name]);
return $stmt;
}
catch(PDOExeception $e)
{
echo $e->getMessage();
}
}Home.php.php
connect();
$image = new Image($connect);
$filename = $_FILES["profile_img"]["name"];
$realname = "public/uploads/" . basename($filename);
$directory = $_SERVER['DOCUMENT_ROOT'] . "/public/uploads/";
$path = $directory . basename($filename);
$image_name = $_POST['image_name'];
if($image->upload_image($realname, $image_name)){
move_uploaded_file($_FILES["profile_img"]["tmp_name"], $path);
$owl = $image->get_image();
}
}?>
Upload Image
File input
This is some placeholder block-level help text for the above input. It's a bit lighter and easily wraps to a new line.
Submit
connect();
$image = new Image($connect);
$photo = $image->get_images();
foreach($photo as $pic)
{?>发布于 2018-06-17 10:23:41
由于某些原因,您没有遵循其他员额中给您的建议。因此,再次指出:
一种不安全措施是向站点用户泄露内部错误消息。把它拿掉,试着抓住那些东西来自数据库交互,并配置您的服务器以适当地报告错误,就像您已经被告知的那样。
将目录添加到文件名也是如此。Please记住,您已经在前面的步骤中添加了它:
$realname = "uploads/" . basename($filename);因此,以下代码毫无意义:
$this->uploadfile = $this->directory . basename($filename);你意识到了吗?此外,负责在数据库中存储文件名的函数应该只存储文件名。分配文件名或错误报告应在其他地方完成。
这意味着上传图像的方法应该是这样的:
public function store($filename, $image_name)
{
$sql = "INSERT INTO images (img, image_name) VALUES (?, ?)";
$this->connect->prepare($sql)->execute([$filename, $image_name]);
}做它唯一想做的事。
在安全性方面,主要是验证文件的扩展名。您的web服务器将根据其扩展名来判断文件类型,您也应该这样做。
$allowed = ['jpg', 'jpeg', 'png', 'gif'];
$extension = pathinfo($_FILES['file']['name'],PATHINFO_EXTENSION);
if (in_array($extension, $allowed)) {
// process your file
} else {
// tell a user the extension is not allowed
}关于一般目的最佳做法。看起来您的名称空间不一致。你好像想要那样的东西
use Eli\Db as DB;
use Eli\Controller\UploadController as Image;此外,还应该实现PSR-4自拍,这样就不必手动包含类定义了。
https://codereview.stackexchange.com/questions/196656
复制相似问题