Profile

coolwolf0: (Default)
coolwolf0

May 2025

S M T W T F S
    123
456789 10
11121314151617
18192021222324
25262728293031

Custom Text

Буквально вчера была окончательно решена проблема перманентного логина в Андроид-приложении.

Краткое содержание предыдущих серий.

1. Немного суровой реальности. Браузер общается с сайтом при помощи так называемой "сессии", то есть некоего набора данных, признаваемого обеими сторонами. В какой-то момент сессия считается просроченной и все данные о контактах браузера с сервером обнуляются. Если, например, сервер подтвердил ввод пароля для данной сессии, то потеряв сессию браузер не сможет утверждать серверу, что он имеет право совершать действия от имени пользователя. Естественно, народ уже давно решил эту проблему при помощи всяких исхищрений. Одним из них, например, является хранение контекста (или токена для его восстановления) в памяти браузера (кукис или локальное хранилище)

2. Ещё более суровая реальность. До сих пор мои сайты и андроид-приложения эксплуатировали эту фичу без зазрения совести. В webView кукис сохраняются так же, как в обычном браузере, достаточно подключить нужную функцию в классе приложения. Но вот настали трудные времена и все внезапно озаботились приватностью. Откладывать кукисы, даже для упрощения логина, оказалось страшно опасным действием. Все сайты вняли требованиям возмущённых пользователей и начали требовать от них добровольно соглашаться на сию потерю анальной девственности. В частности, мои сайты были занесены в "красный список" сами-понимате-какой-корпорацией именно за отсутствие "консента". Пройдя унизительную процедуру я вернул сайтам честное имя, но пользователям от этого лучше не стало. Периодически у них выскакивают напоминания "этот сайт следит за тобой, нажми кнопку чтобы стать его рабом". Логин при этом мягко говоря про%бывается и пользователю приходится совершать дополнительные телодвижения для его восстановления (да, без ввода пароля, но всё равно геморрой).

Какова же альтернатива? Я подумал тут с Gemini, и мы пришли к выводу, что можно хранить токен не в памяти браузера, а в приложении, передавая его туда-сюда через адресную строку. Для десктопного браузера это неприемлемо, ведь тем самым мы позволяем пользователю сверкать у всех навиду голой жопой секретным токеном. Но для смартфона такой опасности нет. Адресная строка в приложении отсутствует, а значит всё, что там лежит остаётся между приложением и сервером. Короче, страничка логина принудительно получает от приложения дополнительный параметр, означающий "это мобильный клиент, ему - можно". При удачном логине сервер делает для такого клиента исключение. Он генерит этому пользователю персональный токен, запомнинает его вместе с датой выдачи и возвращает его в виде аргумента при перенаправлении на основную страницу. А поскольку основная страница тоже рендерится приложением, оно потихоньку считывает этот токен и запоминает его. Но запоминает уже не в виде богомерзкого кукиса, а в своей родненькой памяти, о которой никакой гугель-шмугель не знает, и знать не должОн. Если в следующий раз ему попадётся основная страничка, он пороется в своей памяти и, при наличии там токена, впрыснет его в адресную строку, чисто на всякий случай. В результате, основная страничка, подгружаемая в единожды залогиненом приложении, гарантированно получит токен. Всё, задачка решена, можно удалять код, откладывающий кукисы, а с ним заодно и консент-контент!

Ну и на дессерт: как я решил проблему пароля для регистрации и логина. Основной опасностью тут является хищение пароля всякими сниферами. Так вот, при моей схеме пароль тупо не передаётся на сторону сервера (и соответственно там его нет). Даже если вы сидите на канале пользователя и прорвались через HTTPS, то всё равно увидите только чек-сумму, да и то не самого пароля, а чего-то наложенного на ещё что-то. Как это работает? Очень просто. При регистрации в браузер посылается "соль" которой посыпается пароль. После этого результат (в виде чек-суммы) отправляется на сервер и там сохраняется. Каждая попытка логина сопровождается генерацией дополнительного секретного компонента (назовём его "перец"). Браузер накладывает на введённый пароль и "соль", и "перец" перед тем как вернуть результат на проверку. Сервер вытаскивает "посоленную" чек-сумму для данного пользователя, накладывает на неё индивидуальный "перец" и сравнивает результат с предъявленным браузером. Подделать или зареверсить эту схему практически невозможно.

Дополнительная "фишка" - защита от поддельного запроса на аутентикацию. Дело в том, что в роли "перца" выступает юникс-тайм на данный момент времени (со стороны сервера). Если кто-то вздумает повторить запрос на логин со старым "перцем", то сервер его отвергнет, так как он уже "просрочен" по сравнению с последним успешным логином. Единственной лазейкой является полная имитация всех алгоритмов на стороне браузера, плюс кража секретной чек-суммы пароля (что является фактически кражей самого пароля).
В продолжение поста, где упоминается приложение Дуолинго. Недавно я набрёл на альтернативное приложение для самостоятельного изучения языков - Busuu (тоже хакнутое до "бесплатно-премиум"). Ну что я вам скажу... Начнём с несомненных преимуществ. Если вы берётесь за язык достаточно далёкий от вашего бекграунда, с необычным алфавитом, не-европейской фонетикой и прочими изысками, то это приложение вам идеально подойдёт. В отличие от Дуолинго, где вам за несколько уроков всучают алфавит и безо всякого объяснения начинают гонять по словарному запасу, тут к ученику подходят очень грамотно, с заботой об ассоциативной памяти, систематизируя и группируя новую информацию. Все внешне похожие буквы представлены в единых блоках, а упражения нацелены на заострение отличий между ними. Кроме того, первые уроки про алфавит посвящены исключительно общим сведениям: отсутствие заглавных букв, роль диакритических знаков, принципы слитного и раздельного письма для разных букв. Пройдя три урока в этом приложении я приобрёл гораздо больше практических навыков в чтении, чем за четыре месяца однотипной муштры в Дуолинго.

Ну хорошо, скажете вы, а что же ты не забросишь Дуолинго? Ну во-первых, потому что в Дуолинго я ежедневно соревнуюсь с реальными людьми за лидерство по очкам (и у меня уже есть несколько впечатляющих достижений). Такой подход срабатывает получше любого другого стимула (особенно когда видишь себя в топ-10 среди людей сидящих в приложении по нескольку лет). Ещё один недостаток конкретно арабских материалов Busuu: авторы явно не заморочились с целевой аудиторией и поручили разработку команде академических лингвистов. Конечно же в плане методики преподавания это очень помогло, но теоретики замахнулись на академическую же версию языка вместо разговорной египетской, которая принята в повседневном общении 22 арабоязычных стран. Поэтому в Busuu я стараюсь пропускать всё связанное с лексикой и грамматикой, так как заумные правила литературного языка в реальной жизни вряд ли пригодятся.

Короче, если кому эта тема актуальна, мотайте на ус.
Всех причастных и сочувствующих поздравляю с 5784 годом. Если кто пропустил - ещё не поздно закрыть все долги перед всевышним и людьми - до Судного Дня.

У нас дома, помимо дочкиного дембеля, пошла череда перемен. Сгорел стаааренький кондиционер в салоне, помер относительно новый (11 лет) телевизор. Кроме того, мы наконец-то сподобились заказать у столяра нормальную тумбу под раковину в ванной, а заодно поменять (если хватит средств) и душевую кабинку. В минус к бюджету пойдёт и наша поездка по Португалии имевшая место в начале сентября. Если кто думает, что все эти статьи расходов я покрываю с зарпалаты, то увы. Пришлось продать немного акций (ещё до того, как вся биржа "покраснела").

Доча пошла на "авода мэудефет", то есть малопрестижную работу, за отработку которой министерство обороны выдаёт дембелям дополнительный грант. Из возможных вариантов был выбран кибуц где-то на границе с Иорданией. Место мягко говоря пустынное и малолюдное, кибуц (по сосалистической традиции) еле сводит концы с концами, но работа кипит. Сначала её временно поставили в теплицу на сбор помидорок-чери (где городское дитя успело два раза порезаться). Был вариант поработать на подъёмнике - срезать с пальм финики (сейчас как раз сезон), но она побоялась (и правильно). Остались пруды для разведения рыбы. Физически работа тяжёлая, но пока она справляется. Что характерно, на всех этих участках работают либо дети кибуцников, либо терпилы-дембеля, либо таиландские гастарбайтеры (привезённые по квоте). Вот такой колхоз.

Ну и немного о компьютерах ;-) У меня в приложении добавлена милая фича: выдача попап-напоминания о необходимости обновить RSS (для мобильной версии, как альтернатива пуш-сообщениям). Кстати, за две недели путешествия по Португалии и Испании приложение показало себя просто великолепно - никаких сбоев, словно я сижу дома и читаю новости. Однако, на днях хостер задумал коварное: апгрейд PHP с седьмой антикварной версии на более продвинутую восьмую. Сначала сайт просто не открывался, выдавая ошибку сервера. Потом на меня посыпались сообщения о проблемах с переменными и ключами массивов (при PHP7 такой фигни не было). Еле-еле выкосил эту фигню (если кому надо, решается через $some_var['some key'] ?? null), как обнаружилось, что системные часы на хосте уехали вообще непонятно куда. Исправил часы - начались блокировки хостером за подозрительную активность (редиректы ему не понравились, куссоммо). Я запаниковал, стал бекапить базу и переезжать на заранее подготовленные позиции альтернативного аккаунта (где PHP8 ещё не повалялся). Но вроде бы на текущий момент всё устаканилось (тьфу-тьфу-тьфу). Чего и всем желаю ;-)
Приложения на андроид

Поставил на стример LazyMediaDeluxe - классное приложение, интегрирующее работу всей приставки. Там даже есть менеджер для запуска остальных приложений. То есть его можно ставить в качестве десктопного автостарта.
Основная же функция - просмотр торрентов в режиме онлайн. Встроенный плеер понимает команды с пульта и вообще работает очень грамотно. Рекомендую. По ссылке откроется сайт белорусских умельцев, сделавших конфетку из обвешанного рекламой безобразия.

Read more... )
OSZAR »