2010-06-30 4 views
2

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

Мой .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); 
} 

ответ

1

Простой и безопасное решение было бы использовать следующую схему. Это позволит вам ограничить доступ к загруженным файлам и избежать проблем с загрузкой файлов .php. Размеры файлов ограничены размером длинного блока размером 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

О, простые решения всегда самые лучшие! Я всегда соглашался с людьми, которые говорят, что не хранят изображения и документы в БД, но в этом случае главная проблема в управлении доступом - это лучшее решение. Спасибо, что вы это поняли. – John

0

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

Смежные вопросы