id: Гость   вход   регистрация
текущее время 21:55 13/05/2021
Автор темы: Гость, тема открыта 16/02/2010 16:21 Печать
Категории: сайт проекта, статьи, разное
https://www.pgpru.com/Форум/Офф-топик/ВебСервисРаздачиФайловДоступКФайлу
создать
просмотр
ссылки

Веб сервис раздачи файлов: доступ к файлу


Давно и с удовольствием читаю pgpru, особенно нравятся объяснения "на пальцах" от unknown (из недавнего). Всегда хотелось применить полученные знания на практике, вот наконец представился случай.
(Нет, конечно я не смастерил квантовый канал :))


Задача стояла следующая:
Огромный пополняющийся архив новостных видео роликов. Партнеры могут заказывать подборки роликов – например "все ролики про Путина". Или так "все ролики про путина на канале НТВ", или "все ролики про НТВ показанные на НТВ в которых Путин ест яблоки".
При этом партнер заказавший подборку не должен иметь возможность скачать ролики не попавшие в подборку.


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


Вот что мы сделали:
При формировании ссылки на файл приписываем к ней token


download/{id_ролика}? Token={token}


token уникален и зависит от
– id_ролика
– имени партнера (login)
– и секретного пароля партнера, не известного даже самому партнеру (internal_pass)


token = H(id_ролика, login, internal_pass)


H – функция хеширования (и это не md5)


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


p/s Зачем я это написал? Сам не знаю, просто радостно что найдено такое простое и красивое решение


 
Комментарии
— SATtva (16/02/2010 16:32)   профиль/связь   <#>
комментариев: 11558   документов: 1036   редакций: 4094
Если internal_pass генерируется вами, поставьте его первым в контексте хэширования. Не забудьте самое главное: разделители между элементами контекста!
— Гость (16/02/2010 16:49)   <#>

Я просто строку клею: conext = id_ролика + login + internal_pass.
Почему internal_pass должен идти самым первым?

т.е. conext = internal_pass + разделитель + login + разделитель + id_ролика
Зачем нужны разделители?
— SATtva (16/02/2010 17:03)   профиль/связь   <#>
комментариев: 11558   документов: 1036   редакций: 4094
Почему internal_pass должен идти самым первым?

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

Зачем нужны разделители?

Чтобы не повторять идиотизм WordPress.
— Гость (16/02/2010 17:28)   <#>

Получается что хеш считается скажем от строки длинной 10 символов, то если известны 5 первых символов найди коллизию будет проще чем если будут известны пять последних символов?

Я не знаю историю с вордПресом, но полагаю что получилось так что у кого то был логин 111 и пароль 222, а у другого логин 11 и пароль 1222
— SATtva (16/02/2010 17:56)   профиль/связь   <#>
комментариев: 11558   документов: 1036   редакций: 4094
Получается что хеш считается скажем от строки длинной 10 символов, то если известны 5 первых символов найди коллизию будет проще чем если будут известны пять последних символов?

Это защита прежде всего от неустойчивых хэш-функций и просто best practice. Следовать ей или нет — это Ваша личная проблема Ваше личное дело. Моё дело — посоветовать.
— Гость (16/02/2010 18:13)   <#>
Ясно, Спасибо!
— unknown (16/02/2010 21:07)   профиль/связь   <#>
комментариев: 9796   документов: 488   редакций: 5664
Партнеры могут заказывать подборки роликов – например "все ролики про Путина". Или так "все ролики про путина на канале НТВ", или "все ролики про НТВ показанные на НТВ в которых Путин ест яблоки".

Так все эти подборки-рубрики в кавычках и есть id_ролика? Они уже предзаданы поставщиком контента с сервера? Их можно выбирать как-бы из готового списка?
И просто нужно заранее раздать просчитанные токены тем, кто имеет право получать определённые ролики, а кто нет?
— Гость (16/02/2010 22:07)   <#>

Нет. Роликов в каждой подборке не один а много.
Выглядит это так:
Формируем и записываем параметры поиска роликов – получаем набор параметров поиска. Передаем партнеру ссылку на с названием полученного набора параметров поиска (что бы партнер не мог самостоятельно выборки конструировать :) ).

Пройдя по ссылке партнер получает RSS со ссылками на ролики. Каждая ссылка на ролик имеет token.
— poptalk (26/02/2010 14:34)   профиль/связь   <#>
комментариев: 271   документов: 13   редакций: 4
По-моему, "имени партнера (login)" не нужно.
— Гость (01/03/2010 11:31)   <#>
По-моему, "имени партнера (login)" не нужно.
В общем случае нужно, т.к. internal_pass не обязательно будут уникальны, в отличии от Login-ов.
— poptalk (03/03/2010 16:48)   профиль/связь   <#>
комментариев: 271   документов: 13   редакций: 4
В общем случае нужно, т.к. internal_pass не обязательно будут уникальны, в отличии от Login-ов.

Вы будете генерировать internal_pass как случайное целое число и боитесь, что internal_pass-ы совпадут у разных аккаунтов?
— Гость (03/03/2010 20:44)   <#>
Вы будете генерировать internal_pass как случайное целое число и боитесь, что internal_pass-ы совпадут у разных аккаунтов?
нет, у нас будет не целое число а bool. специально обученный человек с сертификатом ФСТЕК на удаленке будет приезжать раз или два в месяц и подбрасывать монетку. Так всем спокойней и никто не боится.
— poptalk (03/03/2010 21:57)   профиль/связь   <#>
комментариев: 271   документов: 13   редакций: 4
нет, у нас будет не целое число а bool. специально обученный человек с сертификатом ФСТЕК на удаленке будет приезжать раз или два в месяц и подбрасывать монетку. Так всем спокойней и никто не боится.

Если число длинное, то вероятность совпадения практически равна нулю. Итак, login не нужен.
Ваша оценка документа [показать результаты]
-3-2-1 0+1+2+3