Коротко;
- Использование базы данных для управления аутентификацией.
- Используйте
mod_Rewrite
, чтобы скрыть PHP местоположения файлов. - Храните файлы данных пользователя в области publi c вашей учетной записи на сервере.
- АБСОЛЮТНО ЧИСТАЯ ЗАГРУЗКА ФАЙЛОВ ПОЛЬЗОВАТЕЛЕЙ ПЕРВЫМ !!
- Используйте PHP Заголовки и
file_get_contents()
для представления файлов, как если бы они были родными.
Ниже приведен только пример одного из способов приблизиться к этой широкой топике c
Например; давайте посмотрим на Instagram; они используют сложную версию вышеуказанной системы.
Это изображение Instagram:
https://instagram.flhr1-2.fna.fbcdn.net/v/t51.2885-15/e35/20987296_218244025372607_4512699619393667072_n.jpg?_nc_ht=instagram.flhr1-2.fna.fbcdn.net&_nc_cat=111&_nc_ohc=LwKoP3yHB_AAX-QA9yR&oh=d6d19ba6381de558e7260f44897f6010&oe=5E8FE8D7
Вы видите все материалы после файла изображения?
- _nc_ht
- _nc_cat
- _nc_oh c
- о
Это трекеры и определения. Они используются для обеспечения правильности загруженного изображения; если вы загрузите URL без них, вы получите:
https://instagram.flhr1-2.fna.fbcdn.net/v/t51.2885-15/e35/20987296_218244025372607_4512699619393667072_n.jpg
, что дает вам:
"Bad URL Timestamp"
Поскольку файл .jpg НЕ JPEG . Это файл PHP, который притворяется основным файлом, имя файла также не существует, но используется для генерации .htaccess
mod_rewrite,
, поэтому, применяя этот пример к вашему сценарию:
Запрос: /myfolder/mark/20987296_218244025372607_4512699619393667072_n.jpg
is
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/myfolder/(*.[^/]+)/([0-9]+)_([0-9]+)_([0-9]+)_n.jpg$ /imageProcessor.php?folder=$1&image=$2&var3=$3&var4=$4 [NC,L,QSA]
Файл PHP imageProcessor.php
будет выглядеть примерно так:
<?php
// headers
// PHP tells the browser it is a JPEG file type.
Header("content-type: image/jpeg");
// validate $_GET data and
if(is_numeric($_GET['image']) && $_GET['oh'] > (time() - 3600) ){
// check database of values; such as if this image is visible
$imageData = $DatabaseObject->getImage((int)$_GET['image']);
// Load the result file path from the database,
// check it fits the database value
if($_GET['folder'] === $imageData['user_folder']
&& file_exists ($ imageData ['user_folder'])) {
// load the file with file_get_contents
$image = file_get_contents($imageData['image_path']);
}
print $image;
Таким образом, вы можете создать полную систему, в которой пользователь и браузер будут видеть во внешнем интерфейсе полностью отличается от того, что на самом деле происходит на сервере; Вы можете содержать пользователей в определенных пространствах, определенных их атрибутами базы данных в соответствии со значениями их учетной записи.
выше - ЧРЕЗВЫЧАЙНО ПРОСТОЙ ПРИМЕР но основных принципов должно быть достаточно, чтобы вы начали, как вы можете аутентифицировать своих пользователей на основе папки:
Пользователь login ha sh может быть любой строкой фиксированной длины, которая генерируется, когда пользователь входит в систему и является уникальной в базе данных. Эту строку можно использовать в именах файлов или в строках запросов для идентификации пользователя, однако $_SESSION
данные гораздо надежнее и могут быть более секретными.
Итак $_SESSION['login_hash'] = "randomGeneratedCodeX";
MySQL:
user_id | user_name | user_folder | user_login_hash
------------------------------------------------------------
1 | userA | mark | randomGeneratedCodeX
2 | userB | jason | randomCodeGeneratedZ
Поэтому, когда пользователь получает доступ к /myfolder/mark/234_464_7681.jpg
, Mod_rewrite фактически получает доступ к /imageProcessor.php?image=234....
Затем ваш код может заглянуть в базу данных и выяснить, сравниваются ли хеши $_SESSION
; и найдите папку:
SELECT user_folder FROM `users_table` WHERE user_login_hash = :sessionString
Где $_SESSION['login_hash'] === :sessionString = randomGeneratedCodeX
. Затем вы можете проверить, существует ли изображение:
$imagePath = "/path/to/data/folders/".$imageData['user_folder']./".$_GET['image'].".jpg";
if(file_exists($imagePath) && $imageData['user_folder'] === $_GET['folder']){
//File exists so load it into PHP and outpout the image to the browser!
print file_get_contents($imagePath);
}
ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ , что вы должны использовать basi c .htaccess
, чтобы остановить прямой доступ к файлу данных через браузер, или сохраните файл вне каталога public_html
, чтобы он никогда не был доступен из браузера:
Например:
FILE: / yourServerAccount / path / to / data / folder /mark/234.jpg
URL: /yourServerAccount/public_html/imageProcessor.php
Так что это может дать каждому из ваших пользователей свое собственное псевдопространство и, поскольку они входя в систему как один пользователь, они будут жестко закодированы, чтобы не иметь возможности загружать данные из каталога других пользователей.
ВЫШЕ ЭТО ЧРЕЗВЫЧАЙНО ПРОСТОЙ И НЕПРАВИЛЬНЫЙ ПРИМЕР.
Вам необходимо ознакомиться с концепциями и приблизительными примерами, представленными выше.
Библиография:
... и много, много других ссылок и полезной информации .. .