我使用Zend Framework 1.11构建网站。我想在用户上传文件时实现功能,之后可以通过API或web界面下载。问题是我不太了解如何为文件存储提供可接受的安全级别。
我有以下项目结构:
-My Project
-application
-data
-docs
-library
-public
-tests
只有文件夹" public"可公开访问。我的想法是将用户文件保存在文件夹" data"中。当用户想要下载文件时,他向控制器操作发出请求,在那里我可以检查访问权限。如果用户有权访问,php脚本将读取相应的文件并将其发送给用户。
我的问题是:如果在保存用户文件之前加密它(例如使用AES-128算法),它会以某种方式提高文件存储的安全性吗?如果是,保留密钥的最佳做法是什么?
答案 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
Zend Framework: How to intentionally throw a 404 error?
希望这有帮助!