2013-09-25 90 views
1

我在我的网站的应用程序中有一个文件夹,data,它不在web根目录中。这是为了提高安全性,所以只有特定的人才能访问它。我都用过,从看CakePHP的文档中的代码如下:在webroot之外访问文件夹/文件仍在应用程序路径中?

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

$this->response->file($WholePathName); 
return $this->response; 

它加载的文件,但不是我的视野内(上面的代码是在一个视图中,$ImageToSort从内查找调用设置我控制器)。

那么我怎样才能加载文件,不坐在一个类似的循环的webroot,所以我可以查看他们,并以我选择的方式将他们放置在我的网站?

PS。我不能把这些文件放在webroot文件夹中,因为有些人只需要知道文件的名称就可以得到它。访问这些文件需要保持少数。

非常感谢给予任何帮助,

格伦

UPDATE:

我使用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 ">"; 

这无法找到该文件,除非我的文件放入/webroot/data/test,然后显示它的罚款。但那完全没有意义?我只需要选定的用户查看选定的文件的安全问题。

下面的代码不工作在/app/data/test路径内查看该文件,

$this->autoRender = false; 
$this->response->file(Configure::read('uploads').$WholePathName); 

但这代码没有区别在控制器或视图中使用时,它仍只显示文件和没有布局或样式或标题或任何东西。再次,这是完全没有意义的。

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

格伦

+0

看看http://book.cakephp.org/2.0/en/views/media-view.html – Jelmer

+0

我已经看过它的替代品,我正在使用CakePHP 2.4 - 发送文件http:// book。 cakephp.org/2.0/en/controllers/request-response.html#cake-response-file。但是,当我使用它/做一个文件调用它将整个文件加载到浏览器中,而不需要我的布局! –

+0

你在那里添加的代码有点危险!你使用'app'文件夹作为基础,这意味着你可以传递例如'Config/database.php'并检索文件内容!您应该使用一个额外的文件夹(其中只包含应该可访问的文件),如我的示例所示。 – ndm

回答

1

创建适当的控制器/动作,其接受一个路径片段(通过查询例如通过),检查当前用户是否被允许访问的文件,结合了基本路径的路径片段,并输出文件内容。

然后用相应的URL为img元素在您看来src属性,即像

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

这样,只有授权的用户将能够访问您的文件。

这里是一个非常基本的控制器/动作例如,有401的情况下,不允许用户访问文件响应,并在情况下404文件找不到,是不是一个文件或不在范围基本路径,并且如果一切正常它所服务的文件:

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; 
    } 
} 

作为CakePHP的2.4.8的,响应对象确实为可能的路径遍历片段支票,所以从理论上讲,在该示例中,额外的检查可能不需要,因为其中一个没有通过扩展的真实路径,而是原始的连接的!

+0

好的,我想我得到了你在这里说的,但是你的$ base代码行,是指向用户到WEBROOT文件夹?我玩弄它,非常感谢,我让你知道我继续。格伦。 –

+0

不,它并不指向webroot,“ROOT”是CakePHP常量,用于“app”,“lib”等文件夹所在的最顶层文件夹。只需将其更改为您的需求,并将其指向您隐藏文件的任何位置。 – ndm

+0

COOL,谢谢。我玩弄它并回发完整的代码,一次(或者如果?)我得到它的工作....格伦。 –

相关问题