К - Костыль
Reg.Ru рассылает своим клиентам письма с уведомлением о том что GlobalSign теперь выпускает сертификаты не на 365 дней, а на 199. И потому при оплате за год будут выпускаться два сертификата: первый на 199 дней, и второй ещё на 166 после окончания основного. Выглядит жутко.
По-моему это скрытая реклама letsencrypt)
Reg.Ru рассылает своим клиентам письма с уведомлением о том что GlobalSign теперь выпускает сертификаты не на 365 дней, а на 199. И потому при оплате за год будут выпускаться два сертификата: первый на 199 дней, и второй ещё на 166 после окончания основного. Выглядит жутко.
По-моему это скрытая реклама letsencrypt)
Yellow Leaf
Тут обнаружилось что пересланые в Max фоточки доступны по прямым ссылкам всем желающим. Пресс-служба мессенджера отбрехивается в духе "вывсёврёти". Защитники мессенджера настаивают что перебор всех вариантов слишком сложен и потому найти что-то затруднительно.…
Попробовал передавать через Max файлы вместо картинок.
Плохая новость: файлы доступны по прямой ссылке вида:
https://fd.oneme.ru/getfile?sig=....&expires=1773273131002&clientType=6&id=351856972&userId=5179147
Хорошая: есть защита от перебора. При попытке перебирать идентификаторы получаем ошибку "invalid signature".
Но в любом случае получается есть возможность сформировать ссылку на какой-то зловред, которая будет открываться всегда. А доставлять её можно например в СМС. Ну или ещё как. Что очень и очень плохо.
Плохая новость: файлы доступны по прямой ссылке вида:
https://fd.oneme.ru/getfile?sig=....&expires=1773273131002&clientType=6&id=351856972&userId=5179147
Хорошая: есть защита от перебора. При попытке перебирать идентификаторы получаем ошибку "invalid signature".
Но в любом случае получается есть возможность сформировать ссылку на какой-то зловред, которая будет открываться всегда. А доставлять её можно например в СМС. Ну или ещё как. Что очень и очень плохо.
Кейс с картинками в Max показал что не все разработчики знают как защищать картинки и прочие файлы от не санкционированного доступа в веб.
Тот же Telegram в веб-версии использует ссылки вида https://web.telegram.org/some-key и даже не смотря на статичность этого some-key доступ имеют только те кто должен его иметь. Сделать это можно по разному. Мне нравится вариант на базе nginx. Делается это примерно так:
1. Описываем именованный location с типом internal (доступ к таким location снаружи закрыт) примерно так:
Далее описываем основной location и правила рерайта в нём:
PHP использовать не обязательно. Обработчик можно написать на чём угодно. Важно чтобы этот обрабтчик:
1. Находил по ключу в БД путь к файлу
2. Смотрел права доступа на файл в БД
3. Проверял имеет ли запрашивающий файл пользователь достаточно прав (на основе cookie и/или заголовков)
4.1 При отсутствии разрешения отдавал ошибку 403
4.2 При наличии разрешения отдавал заголовок:
Здесь используется фича прокси-модуля в nginx: заголовок X-Accel-Redirect не отправляется клиенту, а указывает серверу что отправить клиенту в качестве ответа.
Таким образом запрашивая ссылку https://your.domain/files/somekey пользователь либо получит ошибку 403, либо получит файл. При этом реальное местоположение файла раскрыто не будет и доступа по прямой ссылке не будет.
P.S. Если будет интересно расскажу как в таких системах реализуется загрузка файла и что делать если веб-приложение работает на одном домене, а хранилище файлов находится на другом.
Тот же Telegram в веб-версии использует ссылки вида https://web.telegram.org/some-key и даже не смотря на статичность этого some-key доступ имеют только те кто должен его иметь. Сделать это можно по разному. Мне нравится вариант на базе nginx. Делается это примерно так:
1. Описываем именованный location с типом internal (доступ к таким location снаружи закрыт) примерно так:
location @private {
internal;
root /var/www/private;
}Далее описываем основной location и правила рерайта в нём:
location / {
root /var/www/public;
rewrite ^/files/(.*) /getfile.php?key=$1 last;
}PHP использовать не обязательно. Обработчик можно написать на чём угодно. Важно чтобы этот обрабтчик:
1. Находил по ключу в БД путь к файлу
2. Смотрел права доступа на файл в БД
3. Проверял имеет ли запрашивающий файл пользователь достаточно прав (на основе cookie и/или заголовков)
4.1 При отсутствии разрешения отдавал ошибку 403
4.2 При наличии разрешения отдавал заголовок:
X-Accel-Redirect: @private/path/to/file
Здесь используется фича прокси-модуля в nginx: заголовок X-Accel-Redirect не отправляется клиенту, а указывает серверу что отправить клиенту в качестве ответа.
Таким образом запрашивая ссылку https://your.domain/files/somekey пользователь либо получит ошибку 403, либо получит файл. При этом реальное местоположение файла раскрыто не будет и доступа по прямой ссылке не будет.
P.S. Если будет интересно расскажу как в таких системах реализуется загрузка файла и что делать если веб-приложение работает на одном домене, а хранилище файлов находится на другом.
👍1
По работе продираюсь через бот-API национального мессенджера. Уже завалил босса получил токен. Делюсь опытом.
1. Регистрируемся на платформе МСП
2. Указываем данные юрлица. Минимум ИП. Самозанятые - мимо.
3. Подтверждаем данные через госуслуги или один из банков на выбор. Выбор банков ограничен Сбером, Альфой и Т-Банком.
4. После подтверждения юрлица подаём заявку на создание бота
5. После ручной модерации ВОЗМОЖНО бот будет создан
6. В случае успеха на предыдщуем пункте получаем токен и приступаем к разработке.
Чтобы нам было веселее:
- Документация весьма поверхностная. К счастью есть готовые библиотеки для Typescript и Go. На последнем я как раз и пишу бота.
- Подтверждение юрлица: после регистрации на платформе надо перейти на госуслуги по ссылке с платформы и зайти с правами генерального директора. Никак иначе. Варианта отправить запрос на госуслуги чтобы гендир его там принял и подтвердил - нет. Поэтому пришлось согласовывать время и в четыре руки проходить авторизацию.
- Постоянно натыкаешься на сообщения "будет реализовано позже". Даже URL slug у бота нельзя задать.
P.S. Прошу прощения за обилие постов про национальный мессенджер. Просто последнее время на работе занимаюсь в основном им.
1. Регистрируемся на платформе МСП
2. Указываем данные юрлица. Минимум ИП. Самозанятые - мимо.
3. Подтверждаем данные через госуслуги или один из банков на выбор. Выбор банков ограничен Сбером, Альфой и Т-Банком.
4. После подтверждения юрлица подаём заявку на создание бота
5. После ручной модерации ВОЗМОЖНО бот будет создан
6. В случае успеха на предыдщуем пункте получаем токен и приступаем к разработке.
Чтобы нам было веселее:
- Документация весьма поверхностная. К счастью есть готовые библиотеки для Typescript и Go. На последнем я как раз и пишу бота.
- Подтверждение юрлица: после регистрации на платформе надо перейти на госуслуги по ссылке с платформы и зайти с правами генерального директора. Никак иначе. Варианта отправить запрос на госуслуги чтобы гендир его там принял и подтвердил - нет. Поэтому пришлось согласовывать время и в четыре руки проходить авторизацию.
- Постоянно натыкаешься на сообщения "будет реализовано позже". Даже URL slug у бота нельзя задать.
P.S. Прошу прощения за обилие постов про национальный мессенджер. Просто последнее время на работе занимаюсь в основном им.
👍1👌1
Оффтоп
Знаю многих людей, которые время от времени что-то покупают на вторичном рынке. Сам тоже отношусь к ним. Вобщем-то это здорово когда какая-то вещь получает вторую жизнь.
Но время от времени сталкиваюсь с людьми, которые делают покупки на вторичном рынке смыслом жизни. Ну и пусть. У каждого свои развлечения и увлечения. Но некоторые становятся настоящими воинами и идут в бой, убеждая других что только так и надо жить.
Когда покупаешь что-то новое эти персонажи начинают тебя убеждать что ты совершил глупость, заплатив втридорога, когда мог купить гораздо дешевле на вторичке. По их мнению подержанная иномарка обязательно лучше новой отечественной, подержанный макбук лучше нового от условного Dexp и т.д. и т.п.
И вот недавно я вдруг понял: вот этим своим походом против новых вещей эти люди буквально мочатся против ветра, ведь чтобы они могли покупать что либо на вторичном рынке, кто-то должен покупать новые вещи.
И чё-т так грустно стало. Не знаю почему. Возможно потому что я опять разочаровался в умственных способностях большого количества людей.
Знаю многих людей, которые время от времени что-то покупают на вторичном рынке. Сам тоже отношусь к ним. Вобщем-то это здорово когда какая-то вещь получает вторую жизнь.
Но время от времени сталкиваюсь с людьми, которые делают покупки на вторичном рынке смыслом жизни. Ну и пусть. У каждого свои развлечения и увлечения. Но некоторые становятся настоящими воинами и идут в бой, убеждая других что только так и надо жить.
Когда покупаешь что-то новое эти персонажи начинают тебя убеждать что ты совершил глупость, заплатив втридорога, когда мог купить гораздо дешевле на вторичке. По их мнению подержанная иномарка обязательно лучше новой отечественной, подержанный макбук лучше нового от условного Dexp и т.д. и т.п.
И вот недавно я вдруг понял: вот этим своим походом против новых вещей эти люди буквально мочатся против ветра, ведь чтобы они могли покупать что либо на вторичном рынке, кто-то должен покупать новые вещи.
И чё-т так грустно стало. Не знаю почему. Возможно потому что я опять разочаровался в умственных способностях большого количества людей.
😁1
Есть API, написанное на PHP и отдающее ответы в JSON. Есть клиент, написанный на Go. Время от времени клиент давится ответом. В лог падает такое:
Изучение показало что проблема в типизации PHP. Вернее в практически полном её отсутствии. Функция json_encode в отсутствии строгой типизации пытается "думать на ходу", в итоге если строковое поле содержит только цифры - кодирует его как int, а если не только - то как строку.
При этом клиентская библиотека на том же PHP не видит никаких проблем и прожёвывает ответ. А вот Go с его строгой типизацией давится. Ищу решение.
json: cannot unmarshal number into Go struct field .data.attributes.code of type string
Изучение показало что проблема в типизации PHP. Вернее в практически полном её отсутствии. Функция json_encode в отсутствии строгой типизации пытается "думать на ходу", в итоге если строковое поле содержит только цифры - кодирует его как int, а если не только - то как строку.
При этом клиентская библиотека на том же PHP не видит никаких проблем и прожёвывает ответ. А вот Go с его строгой типизацией давится. Ищу решение.
Забавно что в PHP 8 (а может и 7) можно нормально генерировать json. И способ даже чем-то похож на Go)
Примерно так:
Но почему-то таким путём идут далеко не все, предпочитая что-то такое:
Примерно так:
<?php
class MyClass {
public string $strVal = "";
}
$obj = new('MyClass');
$obj->strVal = "789";
print json_encode($obj);
Но почему-то таким путём идут далеко не все, предпочитая что-то такое:
<?php
print json_encode([ "strVal" => "789" ]);
В национальном мессенджере появился бот @id1658140062_bot, которому кидаешь адрес, а он возвращает ссылку на домовой чат.
Имеешь ли ты какое-то отношение к этому дому - никак не проверяется.
Представляю какие возможности для спамеров и прочих мошенников открывает этот бот.
Методом тыка обнаружил одно ограничение: с казанского IP бот выдаёт только ссылки на казанские чаты. Если у меня есть жильё в другом городе то похоже чтобы найти чат надо ехать в тот город и оттуда запускать бота)
Чатов частных домов к счастью (или к сожалению) там нет)
Имеешь ли ты какое-то отношение к этому дому - никак не проверяется.
Представляю какие возможности для спамеров и прочих мошенников открывает этот бот.
Методом тыка обнаружил одно ограничение: с казанского IP бот выдаёт только ссылки на казанские чаты. Если у меня есть жильё в другом городе то похоже чтобы найти чат надо ехать в тот город и оттуда запускать бота)
Чатов частных домов к счастью (или к сожалению) там нет)
Яндекс выпустил приложение Интернетометр для измерения скорости интернета на смартфонах с Android. В отличие от конкурентов приложение Яндекса не позволяет выбрать точку, до которой измеряется скорость. Тестирование всегда происходит до серверов Яндекса, которые входят в "белые списки" и работают даже при ограничениях интернета.
У нас в Татарстане во время ограничений сервисы не из "белого списка" продолжают работать, но скорость ограничивается до ~250kbit/s. В итоге хоть и со скрипом, но пользоваться можно.
Вчера немного проехался по Татарстану, Марий Эл и Чувашии и посмотрел как в реальности работают эти самые белые списки в других регионах. Теперь знаю что, например, приложение Ак-Барс банка не входит в "белые списки". Но зато Яндекс Интернетометр всю дорогу убеждал меня что у меня "Отличный интернет" и "Можно комфортно смотреть видео в 2K/4K".
У нас в Татарстане во время ограничений сервисы не из "белого списка" продолжают работать, но скорость ограничивается до ~250kbit/s. В итоге хоть и со скрипом, но пользоваться можно.
Вчера немного проехался по Татарстану, Марий Эл и Чувашии и посмотрел как в реальности работают эти самые белые списки в других регионах. Теперь знаю что, например, приложение Ак-Барс банка не входит в "белые списки". Но зато Яндекс Интернетометр всю дорогу убеждал меня что у меня "Отличный интернет" и "Можно комфортно смотреть видео в 2K/4K".
Немного новостей: "Qt Book Reader 0.1.0". Подробнее: https://www.ylsoftware.com/news/773
Коды подтверждения в Max: они приходят и как будто это хорошо. Но в настольном приложении при нажатии на кнопку "Просмотреть код" получаем сообщение о возможности получения кода только в мобильном приложении. Ровно такая же история в веб-версии.
Сейчас по работе начинаем работу над мини приложением для Max и подозреваю что и там мне будет о чём рассказать.
Сейчас по работе начинаем работу над мини приложением для Max и подозреваю что и там мне будет о чём рассказать.
👌1
Миниприложение в Max это по сути веб-приложение, которое открывается в webview внутри мессенджера. Это окно отличается от обычного браузера в основном наличием некоторых дополнительных JS-интерфейсов для взаимодействия с окружением.
Приложение у пользователя запускается напрямую с сервера разработчика. Таким образом:
1. Разработчик приложения видит реальный IP пользователя.
2. При ограничениях интернета миниприложения скорее всего работать не будут.
Чтобы всем было веселее нигде в документации эти два пункта не проговариваются и выясняются только методом научного тыка.
Приложение у пользователя запускается напрямую с сервера разработчика. Таким образом:
1. Разработчик приложения видит реальный IP пользователя.
2. При ограничениях интернета миниприложения скорее всего работать не будут.
Чтобы всем было веселее нигде в документации эти два пункта не проговариваются и выясняются только методом научного тыка.
Вот и я увидел как взламывают национальный мессенджер.
От соседа пришло сообщение с просьбой "проголосовать за понижение налогов" и html-файл. Файл даже не пришлось скармливать антивирусу. Оказалось достаточно открыть в редакторе чтобы увидеть что в нём кроме редиректа на непонятную страницу ничего нет.
Эту страницу открыл в чистом браузере в песочнице и посмотрел что там. Там по классике: просят ввести номер от аккаунта чтобы проголосовать. Далее механика ясна.
Аккаунт соседа в мессенджере уже заблокирован. Попробую при встрече выяснить как он его будет разблокировать) Файл на всякий случай отправил в одну из антивирусных лабораторий.
От соседа пришло сообщение с просьбой "проголосовать за понижение налогов" и html-файл. Файл даже не пришлось скармливать антивирусу. Оказалось достаточно открыть в редакторе чтобы увидеть что в нём кроме редиректа на непонятную страницу ничего нет.
Эту страницу открыл в чистом браузере в песочнице и посмотрел что там. Там по классике: просят ввести номер от аккаунта чтобы проголосовать. Далее механика ясна.
Аккаунт соседа в мессенджере уже заблокирован. Попробую при встрече выяснить как он его будет разблокировать) Файл на всякий случай отправил в одну из антивирусных лабораторий.
Что-то неожиданно спокойно я стал спать по ночам последние дни. Сегодня меня посетила мысль и быстрая проверка подтвердила догадку: сервер мониторинга не может отправить мне сообщение потому что стоит в РФ и не достукивается до Telegram.
К счастью критичных инцидентов за последние дни не было, только средние, не влияющие на общую картину. Но я всё равно немного расстроен. Ищу альтернативный канал отправки уведомлений. SMS - тупо дорого.
А кто как решает проблему уведомлений в наше не простое время?
К счастью критичных инцидентов за последние дни не было, только средние, не влияющие на общую картину. Но я всё равно немного расстроен. Ищу альтернативный канал отправки уведомлений. SMS - тупо дорого.
А кто как решает проблему уведомлений в наше не простое время?
Дошли руки почитать закон 281-ФЗ, который вносит поправки в КоАП в частности запрещающие "рекламу VPN". Так вот. "VPN" там не упоминается. А упоминаются "Программно-аппаратные средства доступа к информационным ресурсам, информационно-телекоммуникационным сетям, доступ к которым ограничен". Достаточно витиевато.
Очень хочется послушать комментарии юристов, но как будто бы здесь речь идёт не о запрете виртуальных частных сетей, а о запрете обхода блокировок, что есть немного разные вещи.
Очень хочется послушать комментарии юристов, но как будто бы здесь речь идёт не о запрете виртуальных частных сетей, а о запрете обхода блокировок, что есть немного разные вещи.
Дочь пожаловалась что не смогла оплатить проезд в автобусе банковской картой. Якобы карта в чёрном списке. "С *** ли?" подумал я и стал изучать вопрос.
Оказалось что в Казани оплата проезда работает интересным образом: в момент прикладывания карты выдаётся билет и запоминаются данные карты, а реально оплата происходит потом, когда у терминала появляется связь. И если в этот момент на карте недостаточно денег или ещё какая ошибка списания - она попадает в чёрный список.
Судя по всему попытка списания только одна. Попытаться позже - трудно. Чтобы достать карту из чёрного списка надо на сайте транспортной карты авторизоваться по номеру банковской карты(!) и оплатить задолженность.
Думаю что можно придумать множество других решений, не таких сложных и неудобных.
Оказалось что в Казани оплата проезда работает интересным образом: в момент прикладывания карты выдаётся билет и запоминаются данные карты, а реально оплата происходит потом, когда у терминала появляется связь. И если в этот момент на карте недостаточно денег или ещё какая ошибка списания - она попадает в чёрный список.
Судя по всему попытка списания только одна. Попытаться позже - трудно. Чтобы достать карту из чёрного списка надо на сайте транспортной карты авторизоваться по номеру банковской карты(!) и оплатить задолженность.
Думаю что можно придумать множество других решений, не таких сложных и неудобных.