Давайте обсудим архитектурное решение

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті.

Добрый всем день!

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

1. пользователь получает email в котором есть линк на скачку инсталлера типа такого company.com/installer/d authCode=abcd и делает реквест

2. если authCode проходит верификацию у нас на сервере то на этот реквест юзер получает напримеп installer.exe

3. юзер запускает этот инсталлер который в свою очередь делает http реквест к нам чтобы получить все необходимые дальнейшие пакеты для уставновки.

Так вот как идентифицировать нам реквест на шаге 3? Т.е. как сделать что бы значение authCode могло послаться нам инсталлером???

За хорошую, уникальную идею готов проставиться пивом (и не только):)

Сразу отмету некоторые варианты которые либо не приемлимы либо работают с гемороем:

1. куки, которые installer.exe читает непосредственно на стороне клиента — это текущее решение которое очень трудно поддерживать ибо у каждого браузера свои выпендросы

2. dynamic file-name инсталлера — тоже не подходит ибо при сохранении браузер может переименовать инсталлер да и юзер сам может его обозвать как угодно

3. ресурсный файл который можно подпихивать к самому инсталлеру на стороне сервера. Не подходит ибо инсталлер подписанный. И подписывать заново на каждый реквест мы не можем.

Хочу сказать что я уже нашел решение, но оно несколько не безопасное ибо я модифицирую уже подписаный инсталлер.

Спаибо всем за внимание

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Существувет ли в приложении регистрация (username/password)?
можно привязаться к каким либо другим параметрам как MAC address.

Точно можно сделать если юзер зайдет IE, насчет браузеров можно проверить, не углублялся особо.

to Аноним

А что будет, если закачка обрывается в процессе скачки 50−70 Мб?

Это уже не мое дело. Этими вопросами занимается другая команда разработчиков клиентской части и я думаю что там много чего предусмотрено.

А если скачанные пакеты перехватить и сохранить отдельно, кому-то передать?

И это не мое дело потому что этим вопросом (subscription handling) занимается другая команда на стороне сервера.

А что будет, если закачка обрывается в процессе скачки 50−70 Мб?

А если скачанные пакеты перехватить и сохранить отдельно, кому-то передать?

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

Еще раз говорю что в данном моменте кикод одноразовый, а инсталлер это только 300К исполняемого кода чтобы собрать все необходимые для полной исталляции данные, инициировать реквест, получить с сервера 50−70М инсталяционных пакетов и запустить процесс. Дальше его можно выкинуть.

Не предусмотрен достаточно простой сценарий

Пользователь А на дискете передает installer.exe пользователю Б и он его запускает на своем компе.

Вот только ворос к Win девелоперам — если майкрасофт вдруг изменит метод провертки подписи то все полетит в трам тарарам!!! Кто может проконсультировать насколько это легальсно с формальной точки зрения дописывать в тело подписи наши данные??? Это очень ваный вопрос.

А если попробовать провернуть это же самое, но с кастомными секциями, интересно, будет ли подписываться секция в исполняемом файле, которая не принадлежит к стандартным.
#pragma section ( «authid_s», read)
__declspec (allocate ( «authid_s» )) const char* __authid= «PADXPADXPADXPADXPADXPADX»;
В коде обязательно нигде не ссылаться на __authid. Потом подписать файл и затем найти в нём PADX... и заменить на что-то другое, будет ли ругаться проверяльщик?

А по поводу контрольной суммы, она проверяется только при загрузке драйверов.

to Offset

А не надо потом и думать что ктото запустит копию инсталлера. Кикод то одноразавый. Смотрите на это как на то что вы вводите на телефоне код чтобы пополнить счет.

to junior_dev

Спасибо за линк и хинт, посмотрел — надо будет подумать. Пока что я поменял ручками CheckSum секции IMAGE_OPTIONAL_HEADER на правильный и все идет пучком. Проходит валидация подписи и контрольной суммы. Файл запускается, видна показывает как трастет — так что все нормально. Менеджмент дает время на дальнейшее исследование в этом направлнеии. Вот только ворос к Win девелоперам — если майкрасофт вдруг изменит метод провертки подписи то все полетит в трам тарарам!!! Кто может проконсультировать насколько это легальсно с формальной точки зрения дописывать в тело подписи наши данные??? Это очень ваный вопрос.

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

А если серваку запоминать дату+время запроса с соответствующим authCode — браузер же сохранит файл так что время его создания будет ~= времени запроса. Ну и инсталлер отошлет свою дату создания серверу, который сопоставит ее с authCode. Хотя тут будет работа с неким интервалом, но тогда можно и айпишник учитывать — откуда запрос пришел.

как сервет не отличит что инсталлер версии 1.0 сделал реквест от меня или от тебя или еще от кого

Якщо вписувати кікод в інсталер, то будь-хто може запустити його копію і сервер не зможе відрізнити.

Імхо, треба юзати всю доступну інформацію, яку можна дістати через http-request.

То есть на сервере вы в бинаре например MinorSubsystemVersion прописываете кикод, а потом эту же секцию читаете на клиенте для определения кикода.

2Дмитрий Ковтун — я имел ввиду что вы динамически можете менять и считывать версию бинаря из msdn.microsoft.com/...ibrary/ms680339 (v=VS.85).aspx

то есть практически то что вы делаете с добавлением кикода в конец

Итак самые последние новости по принятому подходу говорят что это сакс:) Собрался целый консилиум бывалых которыя были мягко говоря удивлены такому «грубому вмешательству» в уже подписаный бинарник. Натравили мы на него свой верификатор и что Checksum: 0×0013f792 (in file: 0×001361f1) -> Bad checksum! вот так-то, хотя ни одна винда этого и не увидела и приcпокойно показывает «The digital signature is OK»

Все, ни осталось ни одного способа на нормальное решение этой задачи.

Вот на такое недавно наткнулся:

Овердрафт под депозит
Все овердрафты предоставляются в гривне:
* 80% от суммы вклада по ставке +3.5% к ставке по депозиту в гривне
* 70% от суммы вклада по ставке +11.0% по депозиту в долларах США

* 70% от суммы вклада по ставке +14.5% по депозиту в евро

www.fuib.com/...ozit_dokhodnyj

Правда не знаю насколько это выгодно и практично.

to eugene_n

Евгений спасибо за пропозиции, пока наивероятнейший кандидат на имплементацию это модификация инсталлера на лету в секции подписи как Майк и подтвердил то что я вчера уже запрототипипровал. Теперь будут дебаты по поводу этого метода. Одна проблема в том что мы хостим бинариники для скачки через сервис Akamai и теперь это может повлиять на кеширование инсталлера т.к. теперь инсталлер будет уникалиным для каждого юзера -, но это уже совершенно другой вопрос.

Мож варто обійтись без іще однієї авторизації, а провести всі дії в межах уже існуючої авторизованої сесії? Правда інсталлятор тоді має бути в вигляді java-applet, ы на стороны клыэнта уже має бути java-plugin (на першому етапв можна зробити підготовку).

По сути — идентифицировать инсталлер можно только двумя способами:
1. Уникальным номером инсталлера.
2. Уникальным номером соединения.
-
Лично я двумя руками поддержу мнение Майка об UIDе вне секции кода. Это не хак, а вполне законное техническое решение.
-
Но если хочется особых извращений — поробуйте привязаться к соединению. Если стандартные куки слишком геморройны:
1. Спуститесь на уровень вниз и попробуйте привязаться к TCP соединению браузера, ведь вам не нужно будет сохранять параметры между сессиями.
2. Поищите возможность вместе с запросом на загрузку инсталлера передать на сервер какой-нибудь UID компьютера или браузера. Потом этот же UID запросите инсталятором.

3. Тут не уверен, но нельзя ли использовать браузер как прокси для соединения? В программах типа клиент-банк, частенько загружается некий ActiveX для создания защищенного соединения.

to junior_dev — кикод 5 символов и он одноразовый и нужен только чтобы инсталлер сделал первый реквест. Дальше кикод не нужен так как в действие приходит система подписки (subscriptions) которая уже из совершенно другой оперы — версию бинаря нет смысла использовать. как сервет не отличит что инсталлер версии 1.0 сделал реквест от меня или от тебя или еще от кого. Примерную логику думали реализовать на имени бинаря, но она привносит зависимость от браузера (у нас уже есть реализация на куках и это тоже сильная зависимость от браузера) — скачивается около 3 мил таких инсталлеров — подписывается весь бинарь

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

В зависимости от типа и длины кикода, сполне возможно вы можете заюзать версию бинаря например

to второй Анонимус.

Лично тебя ни кто и не просит ставить «мою» аппликуху, потому что и без «моей» аппликухи у тебя достаточно того что ломится без твоего ведома в инет — поверь мне.

to первый Аноним.

Нельзя. Тут даже не нужно смотреть как и чем ты обварачиваешь. То есть N-я обвертка дает N+1 бинарник который должен быть подписан и который иметь содержать в себе кикод. Т.е. мы опять имеем задачу предыдущего шага.

Анонимус

К примеру WebMoney Classic ты тоже себе не ставил? Или QIP?)

Лично бы я твою аппликуху, которая без моего ведома ломится в инет и чего то там передает, даже бы и не ставил.

А нельзя ли завернуть Ваш инсталятор в ещё один простой инсталлятор, который будет запускать основной исталятор с нужным параметром. Я имею в виду что-нибудь дубовое-дубовое вроде WinZip Self Extractor. Т.е. оно даже ничего существенного трогать не будет (и особых прав ему не надобно). Соответственно нужно будет не модифицировать инсталлятор, а «заворачивать» его и подкладывать нужный код в «оберётку». Не уверен правда, что это решение не противроечит причинам, по которым Вы подписываете основное инсталлятор.

Народ, всем привет! выручите плиз! вот ссылка www.sbgame.com.ua проголосуйте за команду КОМПРОМИСС по ней! помогите студентам в победе игры! плиз!

to Dorian Gray& Жека

Собирать инсталлер для каждого юзера мы не можем (я уже указывал это), т.к. его нужно будет подписывать тоже для каждого юзера. Во первых мы подписываем инсталер когда он уже в RTM и после этого трогать его ни-ни. И второе по внутренним правилам мы не можем хранить сертификат для подписи на сервере, поэтому подпись это один процесс, а релиз другой — это уже просто такое правило и тут я ни чего не могу сделать. Поэтому как я сказал, будем «собирать» уже подписаный инсталлер, но это уже как бы и не сборка, а «грубый хак» как некоторые уже выражаются у нас.

+1 к Dorian Gray.

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

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

to Dev.Net
Предлагал и думали над этим тоже. К сожалению DHCP еще не отменяли:) да и если юзеры будут в подсети то к нам будет приходить IP подсети насколько я понимаю.

Скорее остановимся мы на модификации инсталера на «лету» для каждого реквеста. Это конечно принесет некоторые пробоемы по перфомансу, но думаю это решаемо.

Еще одно кривоватое решение:

А что если в момент скачки инсталллятора запоминать IP адрес пользователя на сервере вместе с кодом аутентификации, а когда инсталлятор будет качать пакеты то на сервере будет анализироватся IP с которого обращается инсталлятор и по этому IP искатся код аутентификации?

Одно дело добавлять исполняемый код в конец исполняемого файла, подгружать и выполнять его — вот это как раз несекьюрно. А просто данные в конце файла, которые даже не будут явно загружены в память при запуске, так как оно не принадлежит никакой секции, на секьюрность не влияют. А досовский механизм исполняемых оверлеев всё ещё работает в винде:) поэтому видимо и позволяют делать так.

to Mike Gorchak

Абсолютно верно Майк, я именно и реализовал сегодня этот прототип. Добавляя кикод в конец файла и модифицируя в IMAGE_DIRECTORY_ENTRY_SECURITY поле Size на длину кикода. Но блин как то не безопастно это на мой взгляд. Не могу понять как винда пропускает валидацию такого файла. У меня коллеги которые пишут клиента ходят в шоке сегодня когда я показал что такое прокатывает:)

to Сергей Волошин

эххх забыл указать что это как раз фитча которая была затребована business steering group, т.е. key-code less (без ввода кода) инсталляция, которая избавляет «бедного» юзера от лишних действий. Ввод кода у нас есть и он все еще используется если инсталлер не смог прочитать куки.

Насколько я помню, подписывается не весь исполняемый файл, а только код. Поэтому, если добавить authCode в любом виде в конец исполняемого файла, это ни на что повлиять не должно. А инсталлер уже вычитает authCode из своего тела при запуске.

А вариант когда инсталлер спрашивает authCode у пользователя («Введите authCode»)?

Підписатись на коментарі