Обновить
256K+

Веб-разработка *

Делаем веб лучше

351,5
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Wayback Machine как архив IDOR: как временные ссылки перестали быть временными

Уровень сложностиПростой
Время на прочтение16 мин
Охват и читатели10K

В марте 2026 многие обсуждали ситуацию с доступом к изображениям из ЛС мессенджера MAX по ссылкам, сохранённым через WebArchive. Тогда же многих не устроил ответ компании.

К сожалению, ситуация хуже, чем кажется. Т.к. проблемы не видят не только в MAX, но и в других компаниях (столкнулся с этим, оповещая компании о похожих проблемах). В статье я расскажу, почему считаю ситуацию — проблемой для всех: пользователей, компании, багхантеров. И как связка «WebArchive + IDOR» может стать бомбы замедленного действия для компании.
Более того, эта ситуация — наглядный пример, как отлаженный механизм повышения безопасной разработки (что не найдут внутренние безопасники компании — отловят багхантеры) иногда даёт сбой.

Читать далее

Как запихнуть килограмм LLM в телеграм-бота и не сойти с ума

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели11K

Все началось с прикола, я сидел с друзьями и подумал, а вот было бы прикольно запихать разные модели нейросетей в один чат и заставить их думать, что они реальные люди и работают в корпорации. Весь смысл был в том, чтобы это были действительно разные модели и пользователь мог просто между ними переключаться по запросу. Для начала мне нужно было найти зоопарк апи ключей с бесплатными лимитами. Я прошерстил весь интернет и в итоге нашел относительно норм варианты: Groq для LLama, Google AI Studio для Gemma и Gemini. В целом в это время код был простой, правда все время происходил забавный баг, когда пользователь переключался между моделями, одна модель не хотела отдавать очередь другой и просто притворялась ею, но я в целом без трудностей поправил это через системный промт. Однако до конца у меня исправить это так и не получилось, видимо, мои модели слишком тупые.

Читать далее

Сравнение моделей конкурентности JVM языков: Kotlin coroutines, ZIO runtime и Clojure

Уровень сложностиСложный
Время на прочтение9 мин
Охват и читатели7.7K

Coroutine, Fiber, Virtual thread - это всё одно и то же?

Или нет ?

Или нет.

А если под капотом всё равно JVM, почему нельзя просто везде включить virtual threads и успокоиться? Разберемся!

Узнать что есть кроме Java Threads

Шрифтовые иски в РФ: 15,3 млн ₽ взысканий за 5 лет и как технически проверить свой сайт

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели17K

Если вы веб‑разработчик и хоть раз подключали шрифт «потому что он красивее, чем системный Arial» — есть ненулевая вероятность, что у вас на сайте лежит коммерческий гарнитур без лицензии. Российский бизнес три‑пять лет назад массово открыл для себя, что это не безобидно: за период 2021–2025 годов через арбитражные суды по шрифтовым искам взыскано 15,3 млн ₽ (данные Коммерсанта), число исков выросло в 2,5 раза за пять лет, и тренд продолжается.

При этом проверить свой сайт на потенциально опасные шрифты — технически нетривиальная задача. Парсить CSS «как получится» через регулярки не работает: получаются ложные срабатывания на CSS‑ключевые слова, на источниках вроде Яндекс.Метрики, на иконочных шрифтах. Дальше — про правовую сторону вопроса и про то, как мы написали детектор, который этим не страдает.

Читать далее

Scoped Store: Когда useReducer не тянет, а Redux — слишком

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели8K

Когда локальный стейт в React-модуле начинает расти - разработчик инстинктивно тянется к useReducer+Context. Это работает, пока не перестаёт: ререндеры везде, провайдеры в елочку, логика размазана. В статье разбираю как этот путь выглядит в реальном продакшне на примере редактора субтитров, и почему паттерн Scoped Store на базе Context+Zustand+useRef решает эту проблему чище и проще.

Читать далее

Cursor в разработке: нейропрототип модуля в корпоративной системе

Время на прочтение8 мин
Охват и читатели7K

Современная корпоративная разработка — это всегда про компромиссы. Нужно быстро прототипировать, но при этом не потерять в качестве кода. Хочется держать в голове всю архитектуру — и фронтенд, и бэкенд, и контейнеризацию, и тесты. А по факту время уходит на переключение между десятками вкладок, согласование REST-контрактов и разбор ошибок по логам.

В этой статье мы расскажем, как в проекте нейропрототипа модуля Планирования (PlanningProto) мы использовали Cursor — редактор с ИИ, который встроен прямо в репозиторий.

Читать далее

Как узнать все, о чем думают пользователи, когда бросают покупки: гайд по онлайн-опросам

Время на прочтение10 мин
Охват и читатели7K

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

В статье разобрал, где и когда задавать вопросы, какие метрики (NPS, CES, CSAT) использовать, как избежать типичных ошибок и превратить фидбек в реальные действия по повышению конверсии, чтобы убрать барьеры на пути клиента.

Читать далее

Я сделал приложение в Курсоре за выходные и зарабатываю 1,29 млн рублей в месяц

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели90K

Большинство историй про маленькие продукты, которые один человек запускает в свободное время, мы разбираем в комьюнити и видим одно и то же: человек годами придумывает «ту самую» идею, а когда возможность появляется прямо под носом, проходит мимо. А рынок не ждёт, окно открывается и закрывается уже через пару дней.

Денис это окно не пропустил. Когда Microsoft объявила, что закрывает Skype, он за выходные собрал простую замену и сразу начал продвигать сервис. Через 11 месяцев Yadaphone вышел на $17 500 в месяц, Денис развивает его один, без инвестиций и наёмных сотрудников.

Он сам расскажет, как это было.

Читать далее

Управляемый прокруткой CSS в 2026 году — разработка карусели без JavaScript

Уровень сложностиСредний
Время на прочтение18 мин
Охват и читатели12K

Исторически создание карусели в веб-разработке означало использование какой-либо JS-библиотеки. Slick, Swiper, Flickity, Embla Carousel и другие заполняли пробел платформы. Каждая из них увеличивала размер сборки, имела свои особенности обеспечения доступности и накладные расходы на обработку событий. Полный минифицированный пакет Swiper v11 весит приблизительно 140 КБ; даже модульные импорты составляют 40-60 КБ для ядра и навигации. Умножьте это на бесчисленные маркетинговые страницы, галереи товаров в электронной коммерции и макеты с большим количеством медиаконтента, которые зависят от каруселей, и расходы сильно возрастут: долгое время до интерактивности, блокировка основного потока во время инициализации и большой размер передаваемых данных на каждой странице, где используется слайдер.

Читать далее

Build-time микрофронтенды, или делай проще

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели11K

Привет, меня зовут Александр Богданов, я ведущий фронтенд-разработчик стрима «Программы лояльности» в MWS. Наша команда отвечает за развитие и поддержку продуктов МТС Premium и МТС Cashback. 

На 2025 год у нас было три активных пользовательских витрины, которые использовали разный стек, разные дизайн-системы, по-разному взаимодействовали с бэкенд-сервисами и имели еще целый набор мелких отличий. Из-за этого разработке приходилось поддерживать зоопарк решений и технологий, а также многократно повторять одни и те же действия на разных стеках. Высокие time-to-market и стоимость разработки одной фичи закономерно не устраивали бизнес, поэтому перед нами поставили задачу — перейти на архитектуру микрофронтендов.

В посте расскажу, как мы это сделали с помощью npm-пакетов и какие результаты получили.

Читать дальше

Где лучше размещать блог компании: на поддомене или внутри основного сайта

Время на прочтение22 мин
Охват и читатели7.6K

Всем привет! Меня зовут Владимир Назаров, основатель агентства Head Promo. В последнее время, ввиду того, что мы активно развиваем направления GEO и контент-маркетинга стали появляться вопросы от клиентов: где размещать блог — внутри основного сайта или на отдельном поддомене? Делать site.ru/blog/ или blog.site.ru. На первый взгляд это техническая мелочь. На практике — архитектурное решение, которое влияет на GEO, SEO, индексацию, внутреннюю перелинковку, аналитику, скорость работы редакции, риски для основного домена и даже на то, насколько хорошо бренд будет считываться поисковыми системами и нейросетями.

Почти всегда проблема не в том, что бизнес не знает «правильный ответ», а в том, что пытается выбрать архитектуру в отрыве от цели контента. А здесь как раз нет универсального решения.

Если совсем коротко: для усиления основного сайта в большинстве случаев лучше блог в папке. Но если вы строите отдельное медиа, комьюнити, клуб, форум, UGC-платформу или контентный проект с другой редакционной и технической логикой, поддомен может быть не ошибкой, а правильным выбором.

Ниже — подробный разбор с учетом Google, Яндекса, SEO, GEO/AEO и реальных российских и международных кейсов.

Читать далее

Как я создавал платформу для внутренних торгов мебелью и почему для этого выбрал PocketBase + Nuxt 3

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели12K

Привет, Я Ваня Демидов, разработчик Selectel.

Осенью наша компания решила запустить платформу, на которой сотрудники могли бы купить ненужную офисную мебель. Например, ту, что перестала подходить к обновленному дизайну переговорок, кофе-пойнтов или рабочего спейса. В этой статье я расскажу, как создавал такую платформу и поделюсь опытом использования Nuxt3 и Pocketbase.

Читать далее

Надежный фейс-контроль: как прикрутить MFA к веб-сервису через Nginx и OAuth2 Proxy

Время на прочтение14 мин
Охват и читатели13K

Подключить MFA к современному веб-приложению обычно несложно: достаточно подключить SAML или OIDC на стороне самого приложения и включить второй фактор на Identity Provider. Проблемы начинаются там, где сервис не умеет ни в SAML, ни в OIDC, а переписывать его рискованно, дорого или попросту некому.

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

В этой статье системный инженер Артур Газеев и я, Аскар Добряков, ведущий эксперт направления защиты данных и приложений в К2 Кибербезопасность разбираем, как вынести MFA на периметр для legacy-системы, которую нельзя быстро переписать. Покажем архитектуру решения, объясним, почему выбрали связку Nginx + OAuth2 Proxy + Indeed AM, и разберем, на каких настройках поднимали и отлаживали эту схему.

Читать далее

Ближайшие события

Я хотел adjustResize. Получил adjustNothing. Три раунда войны с Android-клавиатурой в WebView

Время на прочтение8 мин
Охват и читатели8.3K

Я юрист. Я не должен был знать слово adjustResize. Сейчас оно мне снится. Это история про три недели борьбы с Android-клавиатурой в WebView, про MutationObserver, который я призвал и пожалел, и про то, как настоящее решение оказалось не там, где я искал. Если у вас в приложении WebView и формы с инпутами — возможно, я сэкономлю вам неделю.

Три недели войны с клавиатурой

Помогаю новичкам найти ошибки в вёрстке ChatGPT

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели15K

Привет, Хабр!

Мне кажется, что сегодня начинающие фронтендеры уже не пишут код сами. Они отдают всё на откуп искусственному интеллекту. Хорошо это или плохо — судить не буду.

Я хочу помочь вам найти плохие решения в вёрстке, которые ChatGPT вам предлагает. Для этого я собрал наиболее популярные примеры, которые очень просто исправить. Я вам всё покажу.

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

Давайте посмотрим, что я вам подготовил.

Читать далее

Кто набрал сотни звёзд в Open Source СНГ? И как ваш проект может оказаться следующим

Время на прочтение2 мин
Охват и читатели9.2K

⭐️ Каждый месяц мы собираем топ open source проектов СНГ по приросту звёзд!

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

Если вы тоже развиваете Open Source проект, возможно следующий топ будет уже с вашим репозиторием :)

Читать далее

Снова GitHub Actions: разбираем масштабную атаку на TanStack, 84 пакета под угрозой

Время на прочтение36 мин
Охват и читатели8.4K

Команда Socket Threat Research обнаружила компрометацию 84 npm-пакетов в пространстве @tanstack: в них внедрили вредоносный имплант Mini Shai-Hulud, нацеленный на кражу учётных данных и секретов из CI/CD-сред, включая GitHub Actions.

Атака особенно опасна тем, что вредонос автоматически запускается при установке зависимостей через lifecycle-хуки npm, а среди затронутых пакетов есть крайне популярные — например, @tanstack/react-router с более чем 12 млн загрузок в неделю, что делает инцидент серьёзной угрозой для безопасности цепочки поставок ПО.

В статье подробнее разберём механизм заражения, риски для разработчиков и компаний, а также первоочередные меры реагирования — от проверки зависимостей до ротации секретов и аудита CI-пайплайнов.

Читать далее

Подводные камни gRPC в .NET

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели13K

gRPC кажется простым только до первого реального проекта. В этой статье - практические решения для типичных подводных камней: nullable, decimal, DateTime, наследование, дженерики и enum. Всё на основе реального опыта переноса сотни моделей с REST и WCF на gRPC. Обновлено под protoc v34.1 и dotnet 10.

Читать далее

Bad Apple через CSS: как заставить браузер страдать без единой строчки JavaScript

Уровень сложностиСредний
Время на прочтение21 мин
Охват и читатели21K

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

Обычно, если человек хочет показать в браузере видео, он берёт video. Если хочет покадровую анимацию — пишет немного JavaScript. Он же служит и для потоковой передачи данных. Но все эти подходы слишком нормальные, а потому и недостаточно интересные.

Поэтому давайте поставим себе задачу чуть более сомнительную, чем следовало бы: воспроизвести Bad Apple в браузере без JavaScript вообще, опираясь почти целиком на CSS и немного на серверную магию.

Ну и чтобы окончательно не сбивать градус абсурда, бекенд мы тоже не будем писать на чем-то скучно-прагматичном. Если заниматься таким делом, то с достоинством: C++26 и Boost.Beast.

Результат посмотреть можно тут и на GitHub.

Читать далее

Агрегатор LLM, как выбирать живые free-модели и переживать сбои провайдера

Время на прочтение7 мин
Охват и читатели11K

Если в проекте появляется выбор LLM, почти сразу возникает соблазн сделать это как можно проще. Взять один большой список моделей, показать его в интерфейсе, выбрать первую free-модель по умолчанию и считать задачу закрытой. На короткой дистанции это выглядит рабочим вариантом. На длинной начинает ломаться сразу в нескольких местах.

Часть моделей числится бесплатными, но отвечает нестабильно. Часть внезапно исчезает из выдачи провайдера. Часть формально жива, но по качеству ответа годится только для демо. Иногда пользователь выбрал одну модель, а провайдер вернул ошибку. Иногда ответ пришел, но уже от другой модели. Иногда список моделей на фронте устарел, а backend уже живет в другой реальности.

То есть проблема тут не в том, как красиво показать список LLM. Проблема в том, как построить агрегатор, который умеет выбирать живые free-модели, переживать сбои провайдера и не врать интерфейсу о том, какая модель реально ответила.

В одном из своих проектов эта задача решалась не через бесконечный каталог моделей, а через более жесткий инженерный контур. Backend получает сырой список моделей от провайдера, очищает его, отбирает только подходящие free-варианты, оставляет по одной модели на бренд, отдает этот набор на фронт, а во время реального запроса умеет сделать fallback на модель другого бренда. При этом в ответе возвращается не только текст, но и actual_model, чтобы интерфейс знал, кто реально сгенерировал результат.

Читать далее