как защитить фотографии участников для веб-сайта с высоким трафиком
На реальном проекте (сайте знакомств) у меня есть следующий сценарий:
Участник может загружать фотографии (основной профиль), создавать альбомы и назначать им фотографии. Теперь участник может разрешить доступ к альбому только зарегистрированным участникам, премиум-участникам или участникам в его избранном.
Самое простое решение - скрыть альбом, но если кто-то, у кого есть доступ, опубликует URL-адрес src на фотографии, он будет доступен всем, у кого есть URL-адрес.
Я вижу фликр и facebook надежно защищает их, но как я могу реализовать это без необходимости многократно запрашивать базу данных и копировать авторизацию/сеанс пользователя. Фотографии будут храниться на собственном сервере (varnish/nginx).
Есть ли у кого-нибудь идея, как это можно сделать с учетом большого трафика и использовать как можно меньше ресурсов?
Решения должны обрабатывать фактические 20 миллионов участников и около 30 миллионов фотографий.
3 answers
Ну, одной из возможностей было бы запустить что-то вроде Lighttpd mod_secdownload
.
В основном вы устанавливаете "секретную" строку в разделе конфигурации. Затем, когда вы создаете ссылки, вместо того, чтобы создавать ссылку на ресурс, это временная ссылка (поэтому она действительна только в течение $x
количества секунд). Таким образом, пользователю необходимо снова посетить страницу (и, следовательно, снова пройти контроль доступа), прежде чем ему будет разрешено просмотреть это изображение...
В Apache есть аналогичный модуль: mod_auth_token
...
Лучшим решением является хранение изображения за пределами веб-доступной части вашего сервера. Затем, вместо прямой ссылки на фотографию, вы бы ссылались на страницу php, указывающую на изображение следующим образом:
Http://www.example.com/image.php?imageid=1234567
Затем в вашем php-скрипте вы можете проверить, имеет ли вошедший в систему пользователь доступ к фотографии, и если да, вы передаете изображение пользователю в ответ.
Как идея...
Вы можете создать таблицу сопоставления, в которой вы "подготовите" права доступа для пар пользователь->фотография на основе избранного, друзей и т.д.
Затем вы возвращаете изображения на основе этих разрешений, но кэшированные для каждого пользователя. Это снизит нагрузку на ваши серверы, но будет некоторая задержка в применении ограничений из-за тайм-аутов кэша.