BorisovAI
Все потоки
Новая функцияborisovai-site4 заметок

Разработка: borisovai-site

Хроника разработки проекта borisovai-site. Основные направления: новые функции, исследования. Всего 4 записей в потоке. Последние темы: Многоуровневая защита: как я спасал блог от спама; Feedback система за выходные: спам-защита и React компоненты; Как мы превратили экспертную проверку в систему.

#claude#ai#python#javascript#git
Начало
Завершён
1
Новая функция

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

Проект borisovai-site — это блог на React 19 с TypeScript и Tailwind v4. Задача была на первый взгляд простой: добавить форму для читателей, чтобы они могли оставлять комментарии и сообщать об ошибках. Но тут же выяснилось, что без защиты от спама и ботов это превратится в кошмар.

Первый вопрос, который я себе задал: нужна ли собственная система регистрации? Ответ был быстрым — нет. Регистрация — это барьер, который отсеивает легальных пользователей. Вместо этого решил идти в сторону OAuth: пусть люди пишут через свои аккаунты в GitHub или Google. Просто, надёжно, без лишних паролей.

Но OAuth — это только половина защиты. Дальше нужна была многоуровневая система anti-spam. Решил комбинировать несколько подходов:

Первый уровень — детектирование спам-паттернов. Прямо на фронтенде проверяю текст комментария против набора regex-паттернов: слишком много ссылок, повторяющихся символов, подозрительные ключевые слова. Это отлавливает 80% очевидного мусора ещё до отправки на сервер.

Второй уровень — rate limiting. Добавил проверку на IP-адрес: один пользователь не может оставить больше одного комментария в день на одной странице. Второе предложение получает ошибку типа «You already left feedback on this page» — вежливо и понятно.

Третий уровень — CAPTCHA. Использую Google reCAPTCHA для финального подтверждения: просто чекбокс «Я не робот». Это уже из-за того, что на него приходится примерно 30% реальных попыток спама, которые пролезли через предыдущие фильтры.

Интересный момент: во время разработки я заметил, что обычный CAPTCHA может раздражать пользователей. Поэтому решил включать его только в определённых ситуациях — например, если от одного IP идёт несколько попыток за короткий период. В спокойный день, когда всё чистое, форма остаётся лёгкой и быстрой.

В Strapi (на котором построен бэк) добавил отдельное поле для флага «is_spam», чтобы можно было вручную отметить ложные срабатывания. Это важно для ML-модели, которую я планирую подключить позже с Hugging Face для русского спам-детектирования — текущие regex-паттерны неплохо ловят англоязычный спам, но с русским нужна умная система.

Любопытный факт: Google получил patent на CAPTCHA ещё в 2003 году. Это был гениальный ход — вместо того чтобы платить людям за разметку данных, они заставили машины помечать номера домов на Street View. Контрольные вопросы приносили пользу компании.

В итоге получилась система, которая работает в трёх режимах: мягком (для доверенных пользователей), среднем (обычная защита) и жёстком (когда начинается явный спам). Читатели могут спокойно писать, не сталкиваясь с паранойей безопасности, а я тем временем спокойно сплю, зная, что чат-боты и спамеры не затопят комментарии.

Дальше план — интегрировать ML-модель и добавить визуализацию feedback через счётчик вроде «230 человек нашли это полезным». Это увеличит доверие к системе и мотивирует людей оставлять реальные отзывы.

Забавное совпадение: когда я разбирался с rate limiting на основе IP, понял, что это точно такой же подход, который используют все CDN и DDoS-защиты. Оказывается, простые вещи часто работают лучше всего.

#claude#ai#python#javascript#git#api#security
Читать далее
2
Новая функция

Feedback система за выходные: от API до React компонентов с защитой от спама

Понедельник утром открываю Jira и вижу задачу: нужна система обратной связи для borisovai-site. Не просто кнопки “понравилось/не понравилось”, а настоящая фишка с рейтингами, комментариями и защитой от ботов. Проект небольшой, но аудитория растёт — нужна смекалка при проектировании.

Начал я с архитектуры. Очень важно было подумать про защиту: спам никто не любит, а репутация падает быстро. Решил использовать двухуровневую защиту. Во-первых, браузерный fingerprint — собираю User-Agent, разрешение экрана, временную зону, язык браузера, WebGL и Canvas hash. Получается SHA256-подобный хеш, который хранится в localStorage. Это не идеально, но для 80% случаев работает. Во-вторых, IP rate limiting — максимум 20 фидбеков в час с одного адреса. Комбо из браузера и IP даёт приличную защиту без излишней паранойи.

На бэке создал стандартную CMS структуру: content-type feedback с полями для типа отзыва (helpful, unhelpful, rating, comment, bug_report, feature_request), самого комментария, email опционально. Приватные поля — browserFingerprint, ipAddress, userAgent — хранятся отдельно, видны только администратору. Логика валидации простая, но эффективная: пустые комментарии не принимаем, максимум 1000 символов, проверяем на дубликаты по паре fingerprint + targetSlug (то есть одна оценка на страницу от пользователя).

Фронтенд часть оказалась интереснее. Написал утилиту lib/fingerprint.ts, которая собирает все данные браузера и генерирует стабильный хеш — если пользователь вернётся завтра с того же девайса, хеш совпадёт. React Hook useFeedback.ts инкапсулирует всю логику работы с API: submitFeedback() для отправки, fetchStats() для получения счётчиков просмотров (сколько человек оценило), fetchComments() для загрузки последних комментариев с простой пагинацией.

Компоненты сделал модульными: <HelpfulWidget /> — это просто две кнопки с лайком и дизлайком, <RatingWidget /> — пять звёзд для оценки (стандартный UX паттерн), <CommentForm /> — textarea с валидацией на фронте перед отправкой. Каждый работает независимо, можно микшировать на странице.

Интересный момент про fingerprinting. Много разработчиков думают, что браузерный fingerprint — это какое-то магическое устройство, а на самом деле это просто комбинация публичных данных. Canvas fingerprinting, например, — это отрисовка градиента на невидимом canvas и сравнение пикселей. Неочевидно, что WebGL renderer и версия видеодрайвера сильно влияют на результат, и один и тот же браузер на разных машинах выдаст разные хеши. Поэтому я не полагаюсь на fingerprint как на абсолютный идентификатор — это просто дополнительный слой.

Итогом стали 8 готовых компонентов, 3 документа (полный гайд на 60+ строк, шпаргалка для быстрого старта, диаграммы архитектуры) и чеклист вопросов для дизайнера про стили и поведение. API готов, фронтенд готов, тесты написаны. Следующий спринт — интегрировать в шаблоны страниц и собрать статистику с первыми пользователями.

Дальше можно добавить модерацию комментариев, интеграцию с email, A/B тестирование вариантов виджетов. Но сейчас — в production.

Почему GitHub Actions — лучший друг разработчика? 😄 Потому что без него ничего не работает. С ним тоже, но хотя бы есть кого винить.

#claude#ai#javascript#api
Читать далее
3
Обучение

Как мы собрали пакет экспертной оценки и что из этого вышло

В borisovai-site встала типичная задача, которая только звучит простой: нужно было подготовить полноценный пакет для проверки системы feedback опытными разработчиками. Звучит как обычная административная работа, но это была отличная возможность создать инструмент, который сделает экспертизу структурированной и воспроизводимой.

Первым делом я понял объём. Нужно не просто раскидать ссылки на код, а создать комплекс документов: брифинг для экспертов с конкретными техническими вопросами, чек-лист для быстрой ориентации, инструкции для организатора проекта и шаблоны для сбора обратной связи. Это не пять строк README, это полноценный пакет, который должен работать как система.

Начал с архитектуры пакета. Разбил его по ролям: на пять экспертных направлений — безопасность, backend-архитектура, frontend-код, UX/дизайн и production-готовность. Каждому направлению нужны были свои вопросы, достаточно специфичные, чтобы эксперт не занимался ерундой, но при этом охватывающие реальные проблемы. Неожиданно выяснилось, что правильные вопросы — это половина успеха. Вопрос вроде «Насколько хорошо задокументирован код?» даст размытый ответ, а вот «Может ли новый разработчик за час разобраться с API feedback-системы?» уже даёт конкретное понимание.

EXPERT_REVIEW_REQUEST.md стал главным документом — это детальный брифинг на 15 килобайт, где я описал контекст системы, текущие проблемы, которые волнуют команду, и пять специфических технических вопросов на каждое направление. EXPERT_REVIEW_CHECKLIST.md — это его компактный напарник для быстрой ориентации. А HOW_TO_REQUEST_EXPERT_REVIEW.md — пошаговая инструкция для организатора: как выбрать экспертов, как подготовить пакет, как отправить приглашения (даже шаблон email приготовил), как отслеживать ответы и компилировать feedback.

Интересный момент: сам процесс создания этого пакета выявил слабые места в нашей документации. Когда пишешь вопросы для экспертов, понимаешь, что даже тебе не совсем понятно, почему архитектура именно такая. Это классический случай, когда подготовка к экспертизе становится самой полезной экспертизой.

Финальный результат — структурированная система, которая масштабируется. Если в следующий раз понадобится ещё одна экспертная оценка, пакет легко адаптируется под новые вопросы. И главное — у нас есть объективный критерий: целевой рейтинг 4.0+ из 5.0 звёзд. Это не «хорошо» по наитию, а конкретное число, которое можно отслеживать и улучшать.

Теперь осталось только найти экспертов и отправить им пакеты. Сама система feedback оценивает себя через других — очень meta, но работает.


Разработчик: «Я подготовил пакет для экспертной оценки». Эксперт: «А есть ли у вас сам ответ?». Разработчик: «Да, но я хочу услышать ваше мнение». 😄

#claude#ai#git#security
Читать далее
4
Новая функция

Четыре критика нашего feedback-сервиса: жестокая правда

Представь ситуацию: ты потратил недели на разработку системы сбора feedback для borisovai-site, прошелся по best practices, всё выглядит красиво. А потом приглашаешь четырех экспертов провести code review — и они разносят твой код в пух и прах. Нет, не язвительно, а обоснованно. Я тогда сидел с этим отчетом часа два.

Началось с Security Expert‘а. Он посмотрел на мою систему сбора feedback и сказал: «Привет, GDPR! Ты знаешь, что нарушаешь европейское законодательство?» Оказалось, мне не хватало privacy notice, retention policy и чекбокса согласия. XSS в email-полях, уязвимости для timing attack’ов, email harvesting — полный набор. Но самое больное: я использовал 32-битный bitwise hash вместо SHA256. Это как строить замок из картона. Эксперт вынес вердикт: NOT PRODUCTION READY — пока не пофиксишь GDPR.

Потом пришла очередь Backend Architect‘а. Он посмотрел на мою базу и спросил: «А почему у тебя нет составного индекса на (targetType, targetSlug)?» Я посчитал: 100K записей, full-scan по каждому запросу. Это боль. Но это было ещё не всё. Функция countByTarget загружала ВСЕ feedback’и в память для подсчета — классический O(n) на production’е. Плюс race condition в create endpoint: проверка rate limit и дедупликация не были атомарными операциями. Вишенка на торте: я использовал SQLite для production’а. SQLite! Архитектор деликатно посоветовал PostgreSQL.

Frontend Expert просмотрел React-компоненты и нашел missing dependencies в useCallback, untyped any в fingerprint.ts, отсутствие AbortController. Но главное убийство: нет aria-labels на кнопках, нет aria-live на сообщениях об ошибках. Screen readers просто не видели интерфейс. Canvas fingerprinting работал синхронно и блокировал main thread. Проще говоря, мой feedback-форм был отзывчив для слышащих пользователей, но недоступен для людей с ограничениями по зрению.

И ещё Product Owner добавил: нет email-уведомлений админам о критических баг-репортах. Система красивая, но никто не узнает, когда пользователь кричит о проблеме.

Итог? ~2 недели критических фиксов: GDPR-соответствие (privacy notice + право на удаление данных), индекс на БД, транзакции в create endpoint, полная ARIA-поддержка, email-notifications, миграция на PostgreSQL. Сначала казалось, что я строил production-готовое решение. На самом деле я строил красивое демо, которое развалилось при первой серьёзной проверке.

Урок: security, accessibility и database architecture — это не вишни на торте, это фундамент. Ты можешь иметь идеальный UI, но если пользователь не может получить доступ к твоему сервису или его данные не защищены, ничего не имеет значения.

😄 WebAssembly: решение проблемы, о существовании которой ты не знал, способом, который не понимаешь.

#claude#ai#python#javascript#git#api
Читать далее

Оцените материал

0/1000