首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用php 7最佳实践上传图像,使其安全

使用php 7最佳实践上传图像,使其安全
EN

Code Review用户
提问于 2018-06-17 01:48:25
回答 2查看 3.2K关注 0票数 0

我有一个脚本,可以上传图像,将其插入数据库,并显示在主页上。

然而,它是不安全的,我如何使这个脚本更安全,并确保它只允许jpeg/jpg文件。

UploadController.php

代码语言:javascript
复制
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

代码语言:javascript
复制
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)

{?>
EN

回答 2

Code Review用户

回答已采纳

发布于 2018-06-17 10:23:41

由于某些原因,您没有遵循其他员额中给您的建议。因此,再次指出:

一种不安全措施是向站点用户泄露内部错误消息。把它拿掉,试着抓住那些东西来自数据库交互,并配置您的服务器以适当地报告错误,就像您已经被告知的那样。

将目录添加到文件名也是如此。Please记住,您已经在前面的步骤中添加了它:

代码语言:javascript
复制
$realname = "uploads/" . basename($filename);

因此,以下代码毫无意义:

代码语言:javascript
复制
$this->uploadfile = $this->directory . basename($filename);

你意识到了吗?此外,负责在数据库中存储文件名的函数应该只存储文件名。分配文件名或错误报告应在其他地方完成。

这意味着上传图像的方法应该是这样的:

代码语言:javascript
复制
public function store($filename, $image_name)
{
    $sql = "INSERT INTO images (img, image_name) VALUES (?, ?)";
    $this->connect->prepare($sql)->execute([$filename, $image_name]);
}

做它唯一想做的事。

在安全性方面,主要是验证文件的扩展名。您的web服务器将根据其扩展名来判断文件类型,您也应该这样做。

代码语言:javascript
复制
$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
}

关于一般目的最佳做法。看起来您的名称空间不一致。你好像想要那样的东西

代码语言:javascript
复制
use Eli\Db as DB;
use Eli\Controller\UploadController as Image;

此外,还应该实现PSR-4自拍,这样就不必手动包含类定义了。

票数 2
EN

Code Review用户

发布于 2018-06-17 09:20:50

处理上传的最佳方法是使用开源的、设计良好的、经过测试的库,如上传。但是如果你想自己做,你可以使用描述这里的方法

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/196656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档