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


Storing user files securely in Zend Framework 1.11

我使用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中,将文件内容获取到一个变量。

//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

如何在PHP中下载现有文件

PHP -发送文件给用户

Zend框架:如何故意抛出404错误?

希望这对你有帮助!