TOTP
Певен, що всі бачили оці апки для 2FA, де світиться шестизначний код з таймером. Мені особисто не дуже подобається ними користуватися, але вже як є. Я більше хочу поділитися тим, що відкрив для себе, що такий 2FA нескладно інтегрувати в проєкт.
Оцей одноразовий 2FA код який генерується апкою називають TOTP, де перша літера означає time-based. Ідея така, що береться якийсь секрет (унікальний на користувача), береться час (поділений на інтервали до 30с) і це все гарненько хешується. Далі нехитрими маніпуляціями хеш обрізається і перетворюється в шість цифр.
На сервері нема проблем згенерувати одноразовий код, бо там і так живуть усі наші секретні секрети. Моя перша думка, що напевно ж треба якось сходити і сповістити цю 2FA апку від Гугла чи інших, що ось одноразовий код, який ми згенерували, його й показуй. Але як виявилося, не треба нікуди ходити на поклін. Коли налаштовується 2FA, то в QR коді, який пропонується відсканувати, сервер якраз і зашиває секрет. Апка зчитує цей секрет і зберігає собі навіки.
Тепер виходить так, що і сервер, і апка знають один і той самий секрет, а значить апка навіть в офлайні може згенерувати код і показати його на екрані. Сервер робить те саме, порівнює з кодом, який увів користувач, і пускає далі.
Розкажіть, як у вашому селі називають ці апки? ту-еф-апки?
Певен, що всі бачили оці апки для 2FA, де світиться шестизначний код з таймером. Мені особисто не дуже подобається ними користуватися, але вже як є. Я більше хочу поділитися тим, що відкрив для себе, що такий 2FA нескладно інтегрувати в проєкт.
Оцей одноразовий 2FA код який генерується апкою називають TOTP, де перша літера означає time-based. Ідея така, що береться якийсь секрет (унікальний на користувача), береться час (поділений на інтервали до 30с) і це все гарненько хешується. Далі нехитрими маніпуляціями хеш обрізається і перетворюється в шість цифр.
На сервері нема проблем згенерувати одноразовий код, бо там і так живуть усі наші секретні секрети. Моя перша думка, що напевно ж треба якось сходити і сповістити цю 2FA апку від Гугла чи інших, що ось одноразовий код, який ми згенерували, його й показуй. Але як виявилося, не треба нікуди ходити на поклін. Коли налаштовується 2FA, то в QR коді, який пропонується відсканувати, сервер якраз і зашиває секрет. Апка зчитує цей секрет і зберігає собі навіки.
Тепер виходить так, що і сервер, і апка знають один і той самий секрет, а значить апка навіть в офлайні може згенерувати код і показати його на екрані. Сервер робить те саме, порівнює з кодом, який увів користувач, і пускає далі.
Розкажіть, як у вашому селі називають ці апки? ту-еф-апки?
1❤17🔥3👨💻1
Євгеній Гизила
TOTP Певен, що всі бачили оці апки для 2FA, де світиться шестизначний код з таймером. Мені особисто не дуже подобається ними користуватися, але вже як є. Я більше хочу поділитися тим, що відкрив для себе, що такий 2FA нескладно інтегрувати в проєкт. Оцей…
до слова, ось так в QR коді передається секрет через діплінку і query параметри.
otpauth://totp/ExampleCorp:alice123
?secret=JBSWY3DPEHPK3PXP
&issuer=ExampleCorp
&algorithm=SHA1
&digits=6
&period=30
❤14
Пропоную нове слово:
на•вайб•шкодити — коли AI підсуває вам свиню і щось тихенько видаляє чи ламає📝
на•вайб•шкодити — коли AI підсуває вам свиню і щось тихенько видаляє чи ламає
То не я поламав ту форму, то штучка-інтелект знову навайбшкодила! Піду тирків випишу, що більше так не робила
Please open Telegram to view this post
VIEW IN TELEGRAM
❤17🔥6👨💻3🤩1
Not;A=Brand
Вже деякий час гугл просуває ідею Client Hints
заголовків на заміну User-Agent. Вони краще структуровані і, за словами гугла, є privacy focused, ніж User-Agent 😁. Ось мої заголовки для прикладу:
Але що за Not;A=Brand в Sec-Ch-Ua заголовку? Якось він підозріло виглядає і весь день мелькає переді мною в дев консолі.
Виявилося, що цей NotABrand браузер спеціально додається хромом в рамках механізму GREASE (Generate Random Extensions And Sustain Extensibility) і має дві важливі місії:
🆕 перша з них, щоб вебсайти не камʼяніли (TIL: ossification) і з самого початку вміли працювати з невідомими браузерами. Це значення час від часу хромом міняється при релізі нової версії, тому сьогодні це Not;A=Brand, а завтра буде Not)A=Brand чи щось подібне.
💔 друга мета, щоб веб сайти парсили цей заголовок по стандарту structured headers і не ламалися від якихось кривих символів типу крапки з комою чи дужок. В мене вже були пригоди з цим заголовоком, тому можна почитати тут.
Цікаво буде поспотерігати чи спрацює цей NotA=Brand в довгій перспективі, але тим не менш цікаве рішення проблемі закамʼянілості протоколів.
Вже деякий час гугл просуває ідею Client Hints
заголовків на заміну User-Agent. Вони краще структуровані і, за словами гугла, є privacy focused, ніж User-Agent 😁. Ось мої заголовки для прикладу:
Sec-Ch-Ua: "Not;A=Brand";v="99", "Google Chrome";v="139", "Chromium";v="139"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "macOS"Але що за Not;A=Brand в Sec-Ch-Ua заголовку? Якось він підозріло виглядає і весь день мелькає переді мною в дев консолі.
Виявилося, що цей NotABrand браузер спеціально додається хромом в рамках механізму GREASE (Generate Random Extensions And Sustain Extensibility) і має дві важливі місії:
🆕 перша з них, щоб вебсайти не камʼяніли (TIL: ossification) і з самого початку вміли працювати з невідомими браузерами. Це значення час від часу хромом міняється при релізі нової версії, тому сьогодні це Not;A=Brand, а завтра буде Not)A=Brand чи щось подібне.
💔 друга мета, щоб веб сайти парсили цей заголовок по стандарту structured headers і не ламалися від якихось кривих символів типу крапки з комою чи дужок. В мене вже були пригоди з цим заголовоком, тому можна почитати тут.
Цікаво буде поспотерігати чи спрацює цей NotA=Brand в довгій перспективі, але тим не менш цікаве рішення проблемі закамʼянілості протоколів.
🤯6👨💻6❤1
Євгеній Гизила
В копілку до само-ревʼю коду чатом-гпт, я нещодавно для себе відкрив параметр --function-context в git. Ідея цього параметру така, що замість того щоб показувати три рядки до і три після зміни, git буде старатися найти межі функції чи класу і захопити їх з…
Раніше просив AI робити код-ревʼю до своїх змін так:
В результаті він видавав трохи похвали, трохи стилістичних порад і вряди годи вказував на якісь справжні проблеми.
Користі з похвал небагато, тому тепер починаю розмову прямо з брехуньок, що я певен, що в коді є скількись-то помилок і ти мусиш їх усі знайти:
Виправляю проблеми і повторюю знову, а ж поки AI не почне придиратися до стилю чи коментарів.
do code review:
{{ CODE_HERE }}
В результаті він видавав трохи похвали, трохи стилістичних порад і вряди годи вказував на якісь справжні проблеми.
Користі з похвал небагато, тому тепер починаю розмову прямо з брехуньок, що я певен, що в коді є скількись-то помилок і ти мусиш їх усі знайти:
There are 3 mistakes here. Find them:
{{ CODE_HERE }}
Виправляю проблеми і повторюю знову, а ж поки AI не почне придиратися до стилю чи коментарів.
🔥27😱4🤩2👨💻2
А ви бачили, що тепер в докерфайлі можна ставити breakpoint через vscode розширення? можна зупинитися на будь-якому кроці, пороздивлятися що в контейнері, рухатися крок по кроку. На днях дебажив докерфайл і дуже сильно не вистачало чогось такого 😳
1. https://www.docker.com/blog/debug-docker-builds-with-visual-studio-code/
1. https://www.docker.com/blog/debug-docker-builds-with-visual-studio-code/
Please open Telegram to view this post
VIEW IN TELEGRAM
1🤯27🔥17
Ох і хитрий жук цей ваш AI. Каже: "Сер, ваші тести готові", а я дивлюся, а там все мокане-перемокане
😱14🤩4❤1👨💻1
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥27❤6🤩2🎉1👨💻1
Євгеній Гизила
Squircle Недавно дізнався про таку фігуру як squircle, яка схожа на квадрат з округлими кутами, тільки має більш плавний кут заокруглення. Фігура та й фігура, скажете ви, але для мене як для розробника цікавий той факт, що її інколи використовують в UI дизайні…
X (formerly Twitter)
Ibelick (@Ibelick) on X
corner-shape: squircle;
available in chrome for now
used it recently on my site, no more clip-path or svg needed to achieve it
available in chrome for now
used it recently on my site, no more clip-path or svg needed to achieve it
https://x.com/ibelick/status/1988541070045524130?s=46
пропустив новину, що в хром у вересні цього року завезли нативно сквіркл кути
пропустив новину, що в хром у вересні цього року завезли нативно сквіркл кути
corner-shape: squircle🔥5
Як вам таке? 😞 Під виглядом звичайного API токена маскують посилання. Це посилання веде на зловмисний код. Ну і відповідно, коли запускаєш проєкт, то код за посилання викачується і виконується
https://blog.nviso.eu/2025/11/13/contagious-interview-actors-now-utilize-json-storage-services-for-malware-delivery/
https://blog.nviso.eu/2025/11/13/contagious-interview-actors-now-utilize-json-storage-services-for-malware-delivery/
Please open Telegram to view this post
VIEW IN TELEGRAM
😱18🔥2❤1
Дивіться яку штуку в pytest додали. Замість декоратора pytest.parametrize можна прямо посеред тесту запускати subtest
https://t.me/import_hello/86
https://t.me/import_hello/86
Telegram
import __hello__
Вийшла 9 версія pytest, і тепер у ньому з’явилась повноцінна підтримка subtests.
Цю фічу вони підрізали у стдлібного unittest. Але навіщо, якщо у pytest є такий зручний маркер parametrize?
Бо parametrize корисний лише коли дані для теста відомі ще до того…
Цю фічу вони підрізали у стдлібного unittest. Але навіщо, якщо у pytest є такий зручний маркер parametrize?
Бо parametrize корисний лише коли дані для теста відомі ще до того…
🔥11❤1
Сьогодні я дізнався про SO_REUSEPORT з цієї статті [1]. Виявляється в лінксі декілька процесів може слухати один і той самий порт, а лінкс буде розподіляти запити між ними. Load balancing безплатно і з коробки на локальній машині.
Сама стаття про Next.js, Node.JS, але тим не менш може бути цікава для ширшого кола розробників
1. https://blog.platformatic.dev/93-faster-nextjs-in-your-kubernetes
Сама стаття про Next.js, Node.JS, але тим не менш може бути цікава для ширшого кола розробників
1. https://blog.platformatic.dev/93-faster-nextjs-in-your-kubernetes
🔥11
Fetch Metadata
В твітері дізнався про Fetch Metadata заголовки [1]. Якщо браузер добре попросити, то він пришле заголовок в якому скаже чи домен запиту співпадає з доменом з якого робиться. Кажуть, що цими заголовками можна замінити CSRF токени як захист від CSRF атак. Налаштовувати CSRF токени діло не благодарне, тому я тільки за. Хоча не всі з цим погоджуються і найшов нещодавню дискусію на цю тему [2]
1. https://web.dev/articles/fetch-metadata
2. https://github.com/OWASP/CheatSheetSeries/issues/1803
В твітері дізнався про Fetch Metadata заголовки [1]. Якщо браузер добре попросити, то він пришле заголовок в якому скаже чи домен запиту співпадає з доменом з якого робиться. Кажуть, що цими заголовками можна замінити CSRF токени як захист від CSRF атак. Налаштовувати CSRF токени діло не благодарне, тому я тільки за. Хоча не всі з цим погоджуються і найшов нещодавню дискусію на цю тему [2]
Sec-Fetch-Site tells the server which site sent the request. The browser sets this value to one of the following:
- same-origin, if the request was made by your own application (e.g. site.example)
- same-site, if the request was made by a subdomain of your site (e.g. bar.site.example)
- none, if the request was explicitly caused by a user's interaction with the user agent (e.g. clicking on a bookmark)
- cross-site, if the request was sent by another website (e.g. evil.example)
1. https://web.dev/articles/fetch-metadata
2. https://github.com/OWASP/CheatSheetSeries/issues/1803
web.dev
Protect your resources from web attacks with Fetch Metadata | Articles | web.dev
Fetch Metadata is a new web platform feature designed to allow servers to protect themselves from cross-origin attacks.
❤4🔥1
я просто спитав ai чого моя база померла і зовсім не очікував такої емоційної драми 💔
The Consequence: Because the VM was so overloaded (likely out of RAM/CPU), the recovery process couldn't send the "failover" command. It was trying to shout "Restart!" but didn't have the breath to make a sound...
Please open Telegram to view this post
VIEW IN TELEGRAM
😱5❤🔥3👨💻3
Євгеній Гизила
Babe wake up, new tool from astral just dropped 📱 https://github.com/astral-sh/ty
Вчора astral (ruff, uv) випустили бета версію тайпчекара ty для python. На додачу це ще й LSP сервер, тому піду попробую у VS Code
https://astral.sh/blog/ty
Today, we're announcing the Beta release of ty. We now use ty exclusively in our own projects and are ready to recommend it to motivated users for production use.
https://astral.sh/blog/ty
astral.sh
ty: An extremely fast Python type checker and language server
ty is an extremely fast Python type checker and language server, written in Rust, and designed as an alternative to mypy, Pyright, and Pylance.
🔥15❤2👨💻1
Виявляється, що Postgres має функцію pg_logical_emit_message, якою
можна писати у WAL напряму без жодних додаткових таблиць. Зазвичай для outbox pattern роблять окрему таблицю і з неї читають або читають її лог. А тут в теорії можна обійтися і без неї, хоча треба дивитися як воно насправді на практиці працює Please open Telegram to view this post
VIEW IN TELEGRAM
InfoQ
The Wonders of Postgres Logical Decoding Messages
In this article, author Gunnar Morling discusses Postgres database's logical decoding function to retrieve the messages from write-ahead log, process them, and relay them to external consumers, with help of use cases like outbox, audit logs and replication…
🔥5
сьогодні інтуіція була не на моєму боці. Потратив годину, щоб помітити різницю, що в алхімії URL для sqlite з 3 слешами позначає відносний шлях, а з 4-ма — абсолютний. Хоча якщо подумати, то наче логічно, але якщо не думати то вийде як у мене 🤔
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯11👨💻5😱1
Забавний факт. В macOS за замовчуванням файлова система не чутлива до регістру (case insensitive). Тому хоч напиши INDEX.JS, хоч index.js macOS буде вказувати на один і той самий файл.
З іншої сторони довгий час в німецькій мові для малої літери ß єдиним варіантом верхнього регістру були дві літери SS:
Як наслідок цих двох рандомних фактів, якщо в терміналі macOS написати ßh, то запуститься команда ssh, бо верхній регістр обох варіантів буде SSH🤯 . Тепер не важко угадати, яка команда виконується, якщо написати openßl або leß
1. APFS is case-insensitive by default
2. Wikipedia: ß
3. https://x.com/sweis/status/1985409966711456106
З іншої сторони довгий час в німецькій мові для малої літери ß єдиним варіантом верхнього регістру були дві літери SS:
The JavaScript in Google Chrome and Mozilla Firefox will convert "ß" to "SS" when converted to uppercase (e.g., "ß".toUpperCase()).Як наслідок цих двох рандомних фактів, якщо в терміналі macOS написати ßh, то запуститься команда ssh, бо верхній регістр обох варіантів буде SSH
1. APFS is case-insensitive by default
2. Wikipedia: ß
3. https://x.com/sweis/status/1985409966711456106
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯22👨💻4🤩1