2016-01-25 2 views
3

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

Я придумал решение сохранить их в CDN, как это делает facebook. Но как я могу обеспечить, чтобы кто-то не нарушал чужую конфиденциальность, просто поправляя URL-адрес и заменяя случайные символы?

Например: Предположим, что у меня есть два изображения в моей файловой системе CDN,

Загружено user1- https://somecdnlink.com/somelocation/1234abc-5678pqr.jpg

Загрузил user2- https://somecdnlink.com/somelocation/1234abc-5679pqr.jpg

Теперь user2 после загрузки их ПОС решили проверьте URL-адрес изображения. Изображение, которое они только что загрузили, выскользнуло, обнажая место, где оно хранится. Затем он решает проверить, что произойдет, если он уменьшит число 9 и записывает 8 в этом месте.

Это автоматически откроет образ пользователя1, который он сохранил на сервере cdn, и должен быть закрыт.

Как я могу гарантировать, что пользователь2 не имеет доступа к изображениям другого пользователя в файловой системе? Как делают facebook как гиганты?

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

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

Кроме того, хранится в базе данных лучший вариант в таком случае, а не в cdn?

Я использую php и mysql.

+1

Аутентификация! Перед выдачей убедитесь, что пользователь является владельцем ресурса. Obscurity не подходит для этого. –

+0

Предположим, вы получили ссылку на pic-www.mysite.com/123/img/mypic.jpg, но вы не должны ее видеть, как мне ее аутентифицировать? @ronniskansing –

ответ

2

Вы можете использовать один из следующих методов

1. Security through Obscurity(не рекомендуется, но легко!)

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

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

Затем вы можете поддерживать контроль доступа через php-алгоритм, кто имеет ссылку на это изображение.

2. Поток файла через php.(Рекомендуется, дополнительное кодирование требуется)

Обычно, когда не-исполняемый файл доступен через Apache, он просто начинает выводить содержимое файла с соответствующим заголовком.Но если доступ к исполняемому файлу (для модулей, для которого был загружен Apache), вместо прямого вывода файла Apache отправляет запрос выполнения в соответствующий модуль, и как только модуль завершает выполнение скрипта, он отправляет обратно вывод в Apache, который, в свою очередь, отправляется клиенту.

Здесь вы можете сделать .php файл, который обрабатывает все файлы, и внутри него вы можете выполнить все проверки подлинности/авторизации, которые вы хотите выполнить, и как только владелец подтвердит, вы можете отправить файл через php, как показано ниже.

// After validating the user is logged-in and is the rightful owner of the said file. 

// the file you want to send, the user doesnt need to know this, it could we outside of the webroot too, just make sure php has access to it. 
$path = "secret/path/to/the/file/to/be/downloaded"; 

// the file name of the download 
$public_name = basename($path); 

// get the file's mime type to send the content type header 
$finfo = finfo_open(FILEINFO_MIME_TYPE); 
$mime_type = finfo_file($finfo, $path); 

// send the respective headers 
header("Content-Disposition: attachment; filename=$public_name;"); 
header("Content-Type: $mime_type"); 
header('Content-Length: ' . filesize($path)); 

// stream the file 
$fp = fopen($path, 'rb'); 
fpassthru($fp); 
exit; 
+0

Вы просмотрели изображения Facebook? Они похожи на aka.akamai-hd.net/fbstatic/scontent-xx/ something.jpg, изображения аккуратно хранятся в формате cdn с форматами jpg, а изображения отображаются с . Итак, как мне это сделать без ущерба для конфиденциальности пользователей? –

-2

Вы могли бы просто использовать sha1 имя хэш, как это:

$salt = "MySecretSalt"; 
$filename = sha1($username.$salt.microtime()); 

Затем у вас будет имя файла длиной 40 символов.

+2

Безопасность через неясность - ужасная практика. OP, вероятно, ищет аутентификацию. – PeeHaa

+0

Точно, как мне это достичь? –

+0

@PeeHaa Это не так страшно, как вы думаете. Сравните безопасность неясного пароля с безопасностью неясного URL-адреса. И спросите себя, как будет использоваться этот пароль? Связанный вопрос [Включает секретный GUID в URL-адрес Security Through Obscurity?] (Http://security.stackexchange.com/questions/36870/is-including-a-secret-guid-in-an-url-security-through -obscurity) –