在Zend Framework 1.11中安全地存储用户文件

时间:2014-05-12 13:06:59

标签: php zend-framework encryption

我使用Zend Framework 1.11构建网站。我想在用户上传文件时实现功能,之后可以通过API或web界面下载。问题是我不太了解如何为文件存储提供可接受的安全级别。

我有以下项目结构:

-My Project
    -application
    -data
    -docs
    -library
    -public
    -tests

只有文件夹" public"可公开访问。我的想法是将用户文件保存在文件夹" data"中。当用户想要下载文件时,他向控制器操作发出请求,在那里我可以检查访问权限。如果用户有权访问,php脚本将读取相应的文件并将其发送给用户。

我的问题是:如果在保存用户文件之前加密它(例如使用AES-128算法),它会以某种方式提高文件存储的安全性吗?如果是,保留密钥的最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

我会做以下事情:

在我的项目/数据中创建上传文件夹。

将此行添加到 index.php

defined('UPLOADS_PATH')
    || define(realpath(APPLICATION_PATH.'/../data/uploads'));

现在,您可以将此路径用作上传新文件的存储空间。

检查您的网络服务器用户的写访问权限!

现在使用此路径 move_uploaded_file()或将其添加为重命名过滤器到 Zend_File_Transfer_Adapter_Http

$adapter = new Zend_File_Transfer_Adapter_Http();
$adapter->addFilter('Rename',UPLOAD_PATH);

上传的文件将存储在 UPLOAD_PATH

如果 $ adapter-> receive(); 被调用。

现在,您已将文件存储在数据/上传文件夹中。

如果您需要一些逻辑来将文件存储到已登录用户或类似用户,您可以使用前导或结尾 user_id 命名该文件,例如 4711-image.jpg ,其中 4711 是唯一标识符。

如果您需要处理多个文件,请尝试为当前用户创建一个文件夹,并使用该唯一标识符命名,例如 data / uploads / 4711 / image-1.jpg

这些文件永远无法访问,因为您已经意识到,只有公开可以公开访问。

但是现在,用户应该如何获取这些文件?

一个想法是,生成某种令牌,它存储在与用户ID或其他信息相关的数据库中。

或者只使用文件夹和文件名作为唯一标识符,例如 data / 4711 / image-1.jpg

现在创建一个可以读取查询参数的控制器/动作(令牌或url_encoded文件路径)。

在您的Action中,将文件内容添加到变量中。

//get the file you want to present to the user
$userId = $this->_getParam('user_id',NULL); //eg. 4711
$fileId = $this->_getParam('file_id',NULL); //eg. image-1.jpg

//create the filepath
$filePath = $userId.'/'.$fileId;
//get the absolute system path
$fullPath = rtrim('/',UPLOAD_PATH).'/'.$filePath;

//check if file existing
if(@file_exists($fullPath)) {
    $fileContent = file_get_contents(fullPath); //content to var
    //create the file download
    $this->getResponse()
         ->setRawHeader('Content-type: application/octet-stream')
         ->setRawHeader('Content-disposition: attachment; filename="'.basename($fullPath).'"')
         ->sendResponse();
    exit(0);
}
else {
    //nothing found (return 404)
    $this->getResponse()->setHttpResponseCode(404)->sendResponse();
    exit(0);
}

检查以下链接:

http://framework.zend.com/manual/1.12/de/zend.file.transfer.introduction.html

How to download existing file in PHP

PHP - send file to user

Zend Framework: How to intentionally throw a 404 error?

希望这有帮助!