Как превратить папки в изолированные пространства, которые не могут получить доступ к чему-либо кроме них (PHP) - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь создать веб-сайт, на котором пользователи имеют свои собственные творческие пространства, где каждый может видеть эти пространства. Проблема в том, что эти пользователи могут взломать мой сайт, открыв родительские папки. Мне было интересно, есть ли способ обеспечить исключительность этих папок.

Ниже приведена структура, которую я упомянул:

parent/
  child1/
     file1
     file2
     folder/
     image
  child2/
     file

Я просто хочу убедиться, что файлы из child1 будут только быть в состоянии получить доступ к другим только внутри child1. это означает, что file1 может обращаться к папке / изображению, но не ../child2/file или ../../other_file

Также я использую PHP.

1 Ответ

0 голосов
/ 18 февраля 2020

Коротко;

  • Использование базы данных для управления аутентификацией.
  • Используйте 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

Так что это может дать каждому из ваших пользователей свое собственное псевдопространство и, поскольку они входя в систему как один пользователь, они будут жестко закодированы, чтобы не иметь возможности загружать данные из каталога других пользователей.

ВЫШЕ ЭТО ЧРЕЗВЫЧАЙНО ПРОСТОЙ И НЕПРАВИЛЬНЫЙ ПРИМЕР.

Вам необходимо ознакомиться с концепциями и приблизительными примерами, представленными выше.

Библиография:

... и много, много других ссылок и полезной информации .. .

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