codeigniter 代码触发器:防止直接访问文件夹

ruyhziif  于 2022-12-07  发布在  其他
关注(0)|答案(2)|浏览(148)

大家好,我有一个与数据库连接的小项目。我拥有一个上传文件到文件夹的功能,还保存文件路径到数据库。在我的索引页中,我从数据库中读取文件路径,并输出一个表,其中链接到这些文件以供下载。一切正常,文件可以下载,除非,问题是,我忘记保护这个文件夹,昨天意识到我应该以某种方式保护它,因为人们可以直接下载文件的链接,我需要检查用户是否登录,以便能够下载它。
所以我的问题是:如何保护包含这些文件的文件夹不被直接访问,并使只有登录的用户才能从该文件夹下载文件
我的上传路径是./uploads/在这个文件夹里我有htaccess文件

order deny,allow
deny from all

在控制器中我有
public function viewAllPersons() { if($this->ion_auth->logged_in()) { if(!$this->ion_auth->in_group(1)){ show_404(); } else { $data = array(); $data['persons'] = $this->get_persons(); // get all persons from database as array $this->load->view('admin/header_view'); $this->load->view('admin/persons_view',$data); // pass data to the view $this->load->view('admin/footer_view'); } } else { redirect(base_url()); } }
我的视图文件包含此
{

<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
      <h1 class="page-header"><span class="glyphicon glyphicon-th-list"></span> Archive</h1>
      <h2 class="sub-header pull-left">All records db</h2>
     <a href="<?=base_url('dashboard/persons/add');?>" class="add-button pull-right btn btn-success"><span class="glyphicon glyphicon-plus-sign"></span> Add new record</a>

       <form class="navbar-form navbar-right" method="post" action="<?=site_url('dashboard/persons');?>" name="searchform" >
          <div class="form-group">
              <input type="text" id="search" name="search" class="form-control" placeholder="" autocomplete="off"> 
          </div>
          <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-search"></span></button>
      </form>

      <div class="clearfix"></div>
      <div class="table-responsive">

        <table class="table table-striped">
          <thead>
            <tr>
              <th>#</th>
              <th>Firstname</th>
              <th>Middlename</th>
              <th>Lastname</th>
              <th>ID</th>
              <th>Filename</th>
              <th>Data</th>
              <th>Options</th>
            </tr>
          </thead>
         <tbody>
            <?php 
            $counter = 1;
            foreach($persons as $person) { ?>
            <tr>
              <td><?=$person['person_id'];?></td>
              <td><?=$person['first_name'];?></a></td>
              <td><?=$person['middle_name'];?></td>
              <td><?=$person['last_name'];?></td>
              <td><?=$person['personal_number'];?></td>
              <td><a href="<?php echo base_url('/uploads/'.$person["document_path"]) ; ?>"><?=$person['document_path'];?></a></td> <!-- show links to files for each row !-->
              <td><?=$person['created_on'];?></td>
              <td>
                <a href="<?=base_url('/dashboard/persons/edit/'.$person['person_id'])?>">
                  <span class="glyphicon glyphicon-pencil edit-icon"></span>
                </a>
              </td>
            </tr>
           <?php $counter++; } ?>
          </tbody>
        </table>
        <div class="row">
          <?php if(isset($links)) {
            echo $links;
          }?>
        </div>
      </div>
    </div>
      <?php } ?> }

这里是我的问题,当我输出链接到文件,我需要检查用户是否登录之前能够使用保存在数据库中的链接下载文件
Example of project -- picture
因为人们可以通过直接链接下载文件示例
http://website.com/uploads/document.docx
一旦我有了htaccess文件,我就无法下载文件,可能需要一个函数来重写规则或以某种方式向登录用户给予访问权限。
我也尝试了从codeigniter下载助手,但下载文件只有当我删除htaccess规则,如果规则存在于htaccess文件下载助手无法下载文件。提前感谢!

wlp8pajw

wlp8pajw1#

你有几种可能性,最简单的一种是有控制器访问这些文件夹的控制。
您需要一个文件表,其中至少包含:idpath。假设用户A需要文件ABC.jpg(id为1337):你不是给他吃,而是给予他吃。
此路径调用控制器文件的索引,在索引中可以执行以下伪代码:

function index() {
    //Check if logged in
    if (!$user->logged()) {
        redirect('/404');
    }
    //Get file from database
    $file = $this->db->query('SELECT * FROM file WHERE id='.$this->input->get("id"))->result();
    //Then serve the file
    header("Content-type: image/jpeg");
    readfile($file->path);
}

编辑:
我将试着用其他术语来解释它:
1.创建一个名为file的上载文件表。
CREATE TABLE file (id INT NOT NULL AUTO_INCREMENT, path VARCHAR(100) NOT NULL, PRIMARY KEY ( id ))
1.更新你的person表,这样它就不再有document_path,而是file_id。当你上传一个文件时,你把它的路径保存在表file中,然后把文件id分配给这个人(当然是在表person中)。
1.您需要执行<?php echo base_url('/file?id='.$pseron['file_id']);?>,而不是<?php echo base_url('/uploads/'.$person["document_path"]);?>
1.这是因为我们希望用户转到您需要创建File.php(控制器)的特定控制器。
1.在这个控制器中,函数index(控制器File的默认函数)必须做一些我在编辑之前给你看过的事情。这意味着你从数据库中根据文件id检索文件路径,然后你提供文件。这被称为PHP提供而不是Apache(默认)提供文件。

6fe3ivhb

6fe3ivhb2#

我也面临着同样的问题,因为我的文件是直接访问的用户。特别是上传文件和图像。我工作的PHP框架。
我只是在.htaccess文件中添加了一行代码,然后就完成了。如果您的网站文件夹中没有这样的代码,请创建一个.txt文件并将其命名为.htaccess(如果您没有使用任何框架)。然后打开.htccess文件并简单地写入:选项-索引注意:不要将.htaccess文件放在任何文件夹中,只需在htdocs中打开您网站文件夹,然后创建**.htaccess**

相关问题