Управление доступом к файлам на основе значений БД с помощью PHP/Apache


Чего я хочу

Я создаю систему, в которой, когда пользователь загружает изображение, оно отправляется в папку images, где есть две копии изображения, большой палец и большая.

Теперь, когда пользователь загружает изображение, это делается вместе со вставкой строки в базу данных MySQL, где изображение получает идентификатор, а строка содержит значение, которое определяет, доступны ли изображения для общественности или нет (1 для только большого пальца, 2 для обоих) вместе с владельцем (администратором) изображения. изображение.

Чего я не хочу делать, так это если пользователь пытается получить доступ к изображению, перейдя по URL-адресу изображения, и значение в базе данных говорит, что оно не должно быть общедоступным, и сеанс этого пользователя не является владельцем изображения (администратор не вошел в систему), он должен либо сказать, что изображение не найдено, либо доступ запрещен.

Что я себе представляю

Если бы это можно было сделать с помощью php, я представляю себе что-то вроде этого:

//User tries to go to URL "images/IMAGE-ID_thumb.jpg"
if($img['access'] >= 1 || $_SESSION['admin_ID'] == $img['owner_ID']) {
  //Show image thumb
}
else {
  //Access denied
}

Возможно, я мог бы скрыть изображения в защищенной папке .htaccess, сделайте imgae_get.php он принимает переменные URL-адреса, проверяет, доступно ли изображение, и загружает изображение, если это так. Я просто хочу избежать необходимости де/повторной компиляции образа и других процессов, потребляющих много энергии на сервере.

Мой вопрос в том, могу ли я управлять изображением таким образом? Есть ли способ сделать так, чтобы php-скрипт отображался в виде изображения, которое он загружает внутри? Или, может быть, есть какой-то другой/лучший способ, чем через PHP? (Может быть, апачи?) Любые предложения будут очень признательны.

Author: Kristoffer la Cour, 2011-05-17

4 answers

//get_image.php

//Do session/mysql checks as outlined in your code above.

header("Content-Disposition: filename=$imagename.$filetype");
header("Content-type: $mimetype");
readfile(PROTECTED_IMAGE_FOLDER . "$imagename.$filetype");
 4
Author: Explosion Pills, 2011-05-17 12:43:52

Вы можете перенаправлять все запросы на определенные типы файлов (или имена файлов, все, что вы можете регулярно выражать) с помощью файла .htaccess в вашем DocumentRoot:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule \.(gif|jpg|jpeg|png)$ imageHandler.php [NC,L]

Вы можете определить исходный запрос из суперглобального $_SERVER и использовать соответствующие заголовки, чтобы предупредить браузер о том, что вы возвращаете изображение. Затем вы считываете изображение с диска (с помощью file_get_contents() или аналогичного) и записываете его в браузер с помощью echo таким же образом, как вы выводили бы HTML.

 4
Author: Andy, 2011-05-17 12:46:09

.htaccess

#mod_rewrite
RewriteRule ^(.*)_(full|thumb).(jpg|png|gif)$ image.php?i=$1&type=$2&ext=$3

HTML

<img src="http://example.com/image-1_thumb.png" />
=
<img src="image.php?i=image-1&type=thumb&ext=png" />

PHP(image.php)

<?php 
// do basic sanity checks on input
$_GET['i'] = isset($_GET['i']) ? basename($_GET['i']) : null;
$_GET['type'] = isset($_GET['type']) ? basename($_GET['type']) : null;
//unsafe way
//$_GET['ext'] = isset($_GET['ext']) ?  basename($_GET['ext']) : null;
//safe way
$_GET['ext'] = in_array($_GET['ext'], array('png','gif', 'png')) ? $_GET['ext'] : null;

## Do DB Checks on session to owner ect 
/* $_GET
    [i] => image-1
    [type] => thumb
    [ext] => png
*/

// then output
if (file_exists('hiddenimagesfolder/images/'.$_GET['i'].'_'.$_GET['type'].'.'.$_GET['ext'])) {
    header("Content-Type:image/png");
    readfile('hiddenimagesfolder/images/'.$_GET['i'].'_'.$_GET['type'].'.'.$_GET['ext']);
} else {
    //not found
}
?>
 3
Author: Lawrence Cherone, 2015-04-02 14:22:28

"mod_rewrite" все попытки получить доступ к изображению через поддельное имя пути к файлу PHP с именем файла изображения в качестве параметра запроса, а затем творите там свою магию. Хранение изображений за пределами общей папки должно предотвращать любой нежелательный публичный доступ. В качестве альтернативы сохраните фактическое изображение в самой базе данных.

 0
Author: Aaria Carter-Weir, 2011-05-17 12:49:48