Дата аудита: 2026-06-13
websocket.go — CheckOrigin всегда truebackend/internal/handlers/websocket.go:13 — WebSocket принимает соединения с любых источников. В production должен проверять AllowedOrigins.
CheckOrigin: func(r *http.Request) bool { return true }
places.go — ошибка авторизации не типизированаbackend/internal/services/places.go:118 — использует fmt.Errorf("not your place") вместо sentinel error. Вызывающий код не может отличить "не ваше место" от других ошибок.
docker-compose.ymlЛокальный docker-compose.yml содержит:
POSTGRES_PASSWORD: photoplaces_devREDIS_PASSWORD: photoplaces_devMINIO_ROOT_PASSWORD: photoplaces_devJWT_SECRET: dev-secret-change-in-productionРиск: если запустить docker compose up без переопределения секретов, они уходят в production.
deploy/env.prod:
DB_PASSWORD=CHANGE_ME_STRONG_PASSWORDREDIS_PASSWORD=CHANGE_ME_REDIS_PASSWORDJWT_SECRET=CHANGE_ME_JWT_SECRET_32_HEXS3_SECRET_KEY=CHANGE_ME_MINIO_PASSWORDYANDEX_MAPS_API_KEY=ВАШ_КЛЮЧ_ЯНДЕКС_КАРТРиск: деплой с этими значениями провалится, но если кто-то скопирует env.prod на другой сервер — будет дыра.
backend/cmd/api/main.go — rate limiter in-memory активенНесмотря на наличие ratelimit_redis.go, в main.go используется in-memory rate limiter. Redis-версия не подключена.
log.go:114 — string(rune(line)) вместо strconv.Itoa(line)Исправлено. Функция callerInfo конвертировала номер строки в символ Unicode, а не в строку.
strPtr дублируетсяОпределена дважды:
backend/internal/handlers/helpers.go:7backend/internal/services/auth.go:252Риск: при изменении одной копии вторая рассинхронизируется.
reviews.go — самописные утилиты вместо стандартныхbackend/internal/handlers/reviews.go:88-103:
isUniqueViolation — ручной парсинг ошибки pgx, когда есть pgconn.PgErrorcontains, searchString — дубликат strings.Containsmake test-backend → go test ./... ничего не найдётmake test-frontend → npm run test упадёт (нет скрипта в package.json)frontend/package.json не содержит "test" скриптаСтратегия тестирования описана в obsidian_data/Photoplaces_data/decision-test-strategy.md, но не реализована.
frontend/src/lib/map.ts — интерфейс MapProvider есть, но реализован только Yandex Maps. MapLibre/OSM (из docs/MAP_PROVIDERS.md) не реализованы.
backend/cmd/api/main.go использует in-memory ratelimit.go. ratelimit_redis.go написан, но не включён. Решение в Obsidian (decision-rate-limiter-redis.md) помечено как "Accepted (needs implementation)".
env.prod с хардкодом IPS3_PUBLIC_ENDPOINT=http://192.168.88.128:9000 — IP зашит, а не домен. При смене сервера требует ручного редактирования.
Добавлены во все 8 пакетов:
main, config, log, validator, models, handlers, middleware, repository, servicesДобавлены ко всем экспортам: 18 файлов, все компоненты, хуки, типы, утилиты.
Создан.
Уже был, полный и актуальный.
CheckOrigin: return true на проверку ALLOWED_ORIGINSfmt.Errorf("not your place") на sentinel error ErrNotYourPlacedeploy/env.prod на сгенерированныеdocker-compose.yml (вынести в .env)strPtr из services/auth.go, использовать из helpers.gocontains/searchString на strings.Containsenv.prod на доменное имя"test" скрипт в frontend/package.jsonnpm run test в CI