将URI路由到CakePHP中的特定文件夹

时间:2011-12-24 21:10:01

标签: php cakephp routing

简介:

我在CakePHP中有这条路径:app / webroot / storage / 5 / C / _demo / omar.txt,这个路径将被重定向到http://localhost/storage/5/C/_demo/omar.txt

我的问题:

我希望此路径http://localhost/storage/5/C/_demo/omar.txt类似于此http://localhost/storage/uehKDj44/C/_demo/omar.txt,其中 uehKDj44 的数字 5 ,我之所以这么做像这样我不希望任何人将数字5更改为任何数字,所以他们无法访问否则他们首先登录,让我们说如果5属于一个用户将打开,但如果不是将打开,是否有有什么比这更好的方法来保护它?

谢谢

1 个答案:

答案 0 :(得分:1)

将受限数据存储为htdocs文件夹(或CakePHP的webroot)内的普通文件,无需进一步授权即可请求它们,这一直是一项风险很高的业务,应该避免使用。

我无法确定您在.txt文件中存储的数据类型,但我认为它不是从数据库中提取然后保存的。我的理解是该文件的链接显示给登录(授权)用户。

提出更安全的解决方案:

  1. 将文件移到webroot文件夹之外,并使用该文件夹的绝对路径(USERDATA_PATH)创建一个常量。请记住为Web服务器用户设置读取权限(Apache的www-data
  2. 创建一个模型,例如UserData具有存储用户和魔术散列之间关系的基础数据库表(例如,1 =>'uehKDj44',2 =>'ds83skf'等)。您还可以存储文件名,使其稍微复杂一些。
  3. 使用操作UserDataController创建一个控制器serveFile,该操作将秘密密钥作为参数,将其与文件匹配并将文件输出给用户。
  4. public function serveFile($hash= null) {
    
      try
      {
        $data = $this->UserData->findByHash($hash);
        if (!$data) {
          throw new Exception('No match found');  
        }
    
        // Load the data from file 
        $this->set('output', file_get_contents(USERDATA_PATH.DS.$data['UserData']['filename']));                   
      }
      catch (Exception $ex) 
      {
        // No match found - display error message / log
      } 
    }
    

    然后在视图中:

    header('Content-type: text/plain'); 
    echo $output;
    

    这应该可以解决问题。