Cakephp 访问webroot之外但仍在应用程序路径内的文件夹/文件?

Cakephp 访问webroot之外但仍在应用程序路径内的文件夹/文件?,cakephp,file-access,Cakephp,File Access,我的网站应用程序中有一个文件夹,data,它不在web根目录中。这样做是为了额外的安全,所以只有某些人可以访问它。通过查看CakePHP文档,我使用的代码如下: foreach($ImageToSort as $FileDisplayKey => $FileDisplayData) { $FileName = $ImageToSort[$FileDisplayKey]['Fileinfo']['filename']; $WholePathName = 'data/'.$Fi

我的网站应用程序中有一个文件夹,
data
,它不在web根目录中。这样做是为了额外的安全,所以只有某些人可以访问它。通过查看CakePHP文档,我使用的代码如下:

foreach($ImageToSort as $FileDisplayKey => $FileDisplayData) {
    $FileName = $ImageToSort[$FileDisplayKey]['Fileinfo']['filename'];
    $WholePathName = 'data/'.$FileName;
}

$this->response->file($WholePathName);
return $this->response;
它加载文件,但不在我的视图中(上面的代码在视图中,
$ImageToSort
是从我的控制器中的查找调用设置的)

那么,我如何加载不在webroot中的文件,使其具有某种循环,以便查看它们并以我选择的方式将它们放置在我的站点上呢

另外,我不能将文件放在webroot文件夹中,因为某人只需要知道文件的名称就可以获得它。对这些文件的访问权需要保留为少数几个

非常感谢您的帮助

格伦

更新:

我使用的是2.4,从我所了解的情况来看,媒体视图不是我应该使用的,但“发送文件”是取代它们的调用。我尝试将它们与以下代码一起使用:

$this->viewClass = 'Media';

$params = array(
    'id'        => $FileName,
    'name'      => 'example',
    'extension' => 'jpg',
    'path'      => APP . 'uploads/test' . DS
);

$this->set($params);

debug($params['id']);
$name = $params['id'];
$path = $params['path'];
$filename = $path.$name;


//echo 'name::' .$name;
echo "<img src=";
echo $filename;
echo ">";
但在控制器或视图中使用此代码时没有任何区别,它仍然只显示文件,没有布局、样式、标题或其他内容。同样,这是完全没有意义的

必须有一种方法让我可以访问文件并读取所需的文件/文件夹


Glenn

创建一个适当的控制器/操作,该控制器/操作接受路径片段(例如通过查询传递),检查当前用户是否允许访问文件,将路径片段与基本路径组合,并输出文件内容

然后为视图中的
img
元素
src
属性使用相应的URL,例如

<img src='/files/read/?file=foo/bar.jpg'>

从CakePHP 2.4.8开始,响应对象会检查可能的路径遍历片段,因此理论上,本例中的附加检查可能不需要,因为它不会通过扩展的真实路径,而是通过原始的连接路径

我已经研究了它的替代品,我正在使用CakePHP2.4-Send文件。但当我使用它/进行文件调用时,它会将整个文件加载到浏览器中,而不使用我的布局!你添加的代码有点危险!您使用的是
app
文件夹作为基础,这意味着您可以通过例如
Config/database.php
来检索文件内容!如我的示例所示,您应该使用一个额外的文件夹(一个只保存应该可以访问的文件的文件夹)。确定,$wholePathName从数据库中获取,一旦它检查用户是admin(因此他们可以访问所有文件)哪个指向/var/www/app/DATA/CLIENT/ANY-SUB-FOLDERS-make?这仍然是错误的吗?好的,我不确定您将如何访问数据库文件(但请查看您在CakePHP中的文件夹/文件的级别,我相信您的话),那么我是否应该将数据文件夹移到应用程序路径之外,例如,对于/var/www/DATA-Ok,我想我明白你在这里所说的,但是你的$base代码行,是不是把用户指向了WEBROOT文件夹?我玩它,非常感谢,我让你知道我上了。Glenn.不,它没有指向webroot,
ROOT
app
lib
等文件夹所在的最顶层文件夹的CakePHP常量。只需根据您的需要更改它,并将其指向您隐藏文件的任何位置。很酷,谢谢。我玩它,然后把完整的代码发回,一旦(或者如果?)我让它工作了。。。。格伦。
<img src='/files/read/?file=foo/bar.jpg'>
class FilesController extends AppController
{
    public function read()
    {
        // you'd probably use auth component checks and stuff here
        if(testWhetherUserIsAllowedToAccessFiles() !== true)
        {
            throw new ForbiddenException();
        }

        // make sure that the base path points to a folder that only
        // holds the files that should be accessible!
        $base = ROOT . DS . 'files' . DS;
        $fragment = $this->request->query('file');

        // expand to a canonicalized absolute path, it's way easier to
        // test for validity using the real path
        $path = realpath($base . $fragment);

        // just a basic sanity check, you may want to implement some more
        // security checks to make sure there's really no way to access
        // files outside of the base directory! After all this is just
        // some example code.
        if(
            !!preg_match('~\.\.(\\\\|/)~', $fragment) ||
            $path === false || !is_file($path) ||
            mb_strpos($path, $base) !== 0)
        {
            throw new NotFoundException();
        }

        $this->response->file($base . $fragment);
        return $this->response;
    }
}