我使用Zend框架1.11建设网站。我想实现的功能,当用户上传文件后,可以通过API或web界面下载它。问题是我不太明白如何为文件存储提供一个可接受的安全级别。
我的项目结构如下:
-My Project
-application
-data
-docs
-library
-public
-tests
只有文件夹"public"是可公开访问的。我的想法是将用户文件保存在文件夹"data"中。当用户想要下载文件时,他向控制器动作发出请求,在那里我可以检查访问权限。如果用户有访问权限,php脚本将读取相应的文件并发送给用户。
我的问题是:如果在保存用户文件之前我加密它(例如使用AES-128算法),它会以某种方式提高文件存储的安全性吗?如果有,保管钥匙的最佳做法是什么?
我会这样做:
在我的Project/data中创建一个文件夹上传。
将这些行添加到index.php
defined('UPLOADS_PATH')
|| define(realpath(APPLICATION_PATH.'/../data/uploads'));
现在你可以使用这个路径来存储上传的新文件。
检查您的web服务器用户的写访问权限!
现在使用此路径move_uploaded_file()或将其添加为Rename过滤器到Zend_File_Transfer_Adapter_Http。
$adapter = new Zend_File_Transfer_Adapter_Http();
$adapter->addFilter('Rename',UPLOAD_PATH);
上传的文件将被存储在UPLOAD_PATH。
如果适配器->收到();。
现在,您已经将文件存储在data/uploads文件夹中。如果您需要一些逻辑来将文件存储到loggedin用户或类似的用户,您可以将文件命名为以user_id开头或结尾的,如4711-image.jpg,其中4711是唯一标识符。 如果需要处理多个文件,请尝试为当前用户创建一个文件夹,并使用唯一标识符命名,如data/uploads/4711/image-1.jpg。 这些文件永远不会被访问,因为你已经意识到,只有public是公共可访问的。 但是现在,用户应该如何获得这些文件呢? 一个想法是,生成某种令牌,它与用户id或其他一些信息相关,存储在数据库中。 或者直接使用文件夹和文件名作为唯一标识符,如data/4711/image-1.jpg. 现在创建一个可以读取查询参数(token或url_encoded filepath)的Controller/Action。 在您的Action中,将文件内容获取到一个变量。 检查这些链接: 如何在PHP中下载现有文件 PHP -发送文件给用户 Zend框架:如何故意抛出404错误? 希望这对你有帮助!//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);
}