fix(tradein/security): photo-upload — чанковое чтение с капом 10MB + Caddy request_body 12MB (#2233) #2258

Merged
lekss361 merged 1 commit from fix/tradein-photo-upload-stream-cap into main 2026-07-03 06:15:58 +00:00
Owner

Summary

  • trade_in.py::upload_photo: await file.read() (буферизация ВСЕГО тела в RAM до проверки лимита) → чанковое чтение 64KB с капом _MAX_PHOTO_BYTES (10 MiB). 413 бросается СРАЗУ при превышении, остаток тела не вычитывается. Закрывает OOM-вектор при mem_limit: 768m (#2214): multi-GB аплоад больше не может убить backend.
  • Границы сохранены: пустой файл → 400, ровно 10 MiB → проходит (строгий >, как раньше), sanitize-путь (Pillow re-encode) получает байт-в-байт тот же вход.
  • Caddy первый рубеж: request_body { max_size 12MB } scoped на /trade-in/api/* (грубее app-капа, другие маршруты не затронуты).
  • Тест test_upload_photo_streams_over_cap_returns_413_without_full_read: mock UploadFile с бесконечным read + счётчик вызовов — assert 413 и ровно 161 read (кап/64KB+1), т.е. чтение прервалось, а не ушло в бесконечность; INSERT/commit не вызваны.

Как проверено

  • Полный uv run pytest (deselect только test_search_cache_hit): 3021 passed, 6 skipped.
  • code-reviewer: APPROVE (границы empty/ровно-10MB/10MB+1 верифицированы, Caddy scoped корректно).

Closes #2233

## Summary - `trade_in.py::upload_photo`: `await file.read()` (буферизация ВСЕГО тела в RAM до проверки лимита) → чанковое чтение 64KB с капом `_MAX_PHOTO_BYTES` (10 MiB). 413 бросается СРАЗУ при превышении, остаток тела не вычитывается. Закрывает OOM-вектор при `mem_limit: 768m` (#2214): multi-GB аплоад больше не может убить backend. - Границы сохранены: пустой файл → 400, ровно 10 MiB → проходит (строгий `>`, как раньше), sanitize-путь (Pillow re-encode) получает байт-в-байт тот же вход. - Caddy первый рубеж: `request_body { max_size 12MB }` scoped на `/trade-in/api/*` (грубее app-капа, другие маршруты не затронуты). - Тест `test_upload_photo_streams_over_cap_returns_413_without_full_read`: mock UploadFile с бесконечным read + счётчик вызовов — assert 413 и ровно 161 read (кап/64KB+1), т.е. чтение прервалось, а не ушло в бесконечность; INSERT/commit не вызваны. ## Как проверено - Полный `uv run pytest` (deselect только `test_search_cache_hit`): **3021 passed, 6 skipped**. - code-reviewer: ✅ APPROVE (границы empty/ровно-10MB/10MB+1 верифицированы, Caddy scoped корректно). Closes #2233
lekss361 added 1 commit 2026-07-03 06:10:53 +00:00
fix(tradein/security): photo-upload — чанковое чтение с капом 10MB + Caddy request_body 12MB (#2233)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 29s
CI / changes (pull_request) Successful in 20s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 2m16s
edbdd28286
lekss361 merged commit 910bfed5f1 into main 2026-07-03 06:15:58 +00:00
lekss361 deleted branch fix/tradein-photo-upload-stream-cap 2026-07-03 06:15:58 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2258
No description provided.