Ограничение доступа к активам .pdf .jpg - PullRequest
2 голосов
/ 30 июня 2010

Я хочу, чтобы пользователи могли загружать .pdf и изображения и ограничивать доступ к этим файлам на основе привилегий пользователя.Кто-нибудь делал что-то подобное?Основной план присоединения, о котором я подумал, - это проверка контроллера, есть ли у пользователя права на просмотр документа или файла.Если у них есть права, документ извлекается и отображается.

Мой файл .htacces будет содержать

 #Removes access to the secure_files folder by users.
 RewriteCond %{REQUEST_URI} ^secure_files.*
 RewriteRule ^(.*)$ /index.php?/$1 [L]


    ------
    -SQL
    ------

    ------
    - create files table
    -----
    CREATE TABLE `files` (
    id INT NOT NULL AUTO_INCREMENT,
    file_name VARCHAR(50) NOT NULL,
    PRIMARY KEY('id')
    );

    ------
    - create files table
    -----
    CREATE TABLE `privileges` (
    uesr_id INT NOT NULL,
    file_id INT NOT NULL,
    );

    ------
    - create users table
    -----
    CREATE TABLE `users` (
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    email VARCHAR(50) NOT NULL,
    password CHAR(40) NOT NULL,
    PRIMARY KEY('id')
    );

    /*
    * pseudo-Codeigniter code. I can edit this to make 
    * it pure PHP if that would be more helpful 
    *
    */
    public function get_user_files($filename)
    {
       //this is set during login
       $user_id = $this->session->userdata('user_id');

      //check to see if the user has privileges to access the file and gets the file name
      $query = $this->db->join('privileges','privileges.id = files.id')
                     ->select('files.file_name')
                     ->where('privileges.user_id',$user_id)
                     ->where('files.file_name',$file_name)
                     ->limit(1)
                     ->get('files');

    $file = $query->row()->files.file_name;

   if($file)
   {
    //user has privileges to access the file so include it

    //WHAT DO I DO HERE!?!
    //start Would this work?
    $handle = fopen($file, "rb");
    $data['file'] = fread($handle, filesize($file));
    fclose($handle);
    //end would this work?
   }
  $this->load->view('files',$data);
}

Ответы [ 2 ]

1 голос
/ 30 июня 2010

Простым и безопасным решением будет использование следующей схемы. Это позволит вам ограничить доступ к загруженным файлам и избежать проблемы загрузки файлов .php. Размер файла ограничен размером longblob, который составляет 16 МБ.

CREATE TABLE `files` (
id INT NOT NULL AUTO_INCREMENT,
user_id INT NOT NULL,
file_name text NOT NULL,
file LONGBLOB NOT NULL,
PRIMARY KEY('id')
);

Вот php-код для загрузки файла:

$user_file=file_get_contents($_FILES['user_file']['tmp_name']);
//Make the file binary safe
$user_file=mysql_real_escape_string($user_file);
$file_name=mysql_real_escape_string($_FILES['user_file']['name']);
$user_file=mysql_real_escape_string($user_file);

mysql_query("insert into files (user_id,file_name,file)values ("$_SESSION[user_id]","$file_name","$user_file");

Контроль доступа может быть осуществлен путем проверки user_id файла. content-type файла пользователя легко подделать, поэтому не доверяйте $_FILE[name][type], однако это должен быть правильный тип, когда вы разрешаете пользователю загрузить файл. Например, pdf должен иметь этот тип содержимого. header('Content-type: application/pdf');

0 голосов
/ 22 марта 2014

Почему бы просто не поместить их в каталог с .htaccess, блокирующим весь доступ, и использовать php-скрипт для отправки соответствующих заголовков, проверить права доступа и затем выплевывать содержимое файла с помощью функции readfile?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...