Skip to content

fix(web-api): hardening rate-limit, CORS wildcards, query tokens - #584

Merged
biz87 merged 1 commit into
betafrom
fix/issue-576-web-api-security-hardening
Aug 17, 2026
Merged

fix(web-api): hardening rate-limit, CORS wildcards, query tokens#584
biz87 merged 1 commit into
betafrom
fix/issue-576-web-api-security-hardening

Conversation

@Ibochkarev

Copy link
Copy Markdown
Member

Описание

Закрывает три находки security-аудита Web API (#576):

  1. RateLimitMiddleware — ключ только REMOTE_ADDR (без client-controlled HTTP_MS3TOKEN).
  2. CORS — wildcard через preg_quote + *[^.]+ (одна DNS-метка), без «голых» точек в regex.
  3. TokenMiddleware — session token только Bearer / MS3TOKEN / cookie / session; query ms3_token снимается и не является credential.

Тип изменений

  • Исправление бага (non-breaking change)
  • Breaking change (частично: query ?ms3_token= больше не авторизует)

Связанные Issues

Closes #576

Как это было протестировано?

cd core/components/minishop3
composer ci:php   # exit 0
composer stan     # exit 0
./vendor/bin/phpunit tests/Unit/Middleware/RateLimitMiddlewareTest.php
php tests/CorsConfigNormalizeTest.php
php tests/TokenMiddlewareQueryTokenTest.php
  • Автоматические тесты
  • Ручное тестирование против live MODX

Конфигурация тестирования:

  • MiniShop3: fix/issue-576-web-api-security-hardening
  • PHP: 8.4

Чеклист

  • Код соответствует стилю проекта
  • PHPStan без новых ошибок
  • Лексиконы не требовались
  • CHANGELOG.md — на релизе

Дополнительные заметки

Ключ rate limit только по IP, CORS-паттерны через preg_quote и одну
DNS-метку, session token не принимается из query string.
@Ibochkarev Ibochkarev added priority: high Важно исправить в ближайшее время bug Something isn't working labels Aug 16, 2026
@Ibochkarev
Ibochkarev requested a review from biz87 August 16, 2026 09:33
@biz87
biz87 merged commit 003e861 into beta Aug 17, 2026
3 checks passed
@biz87
biz87 deleted the fix/issue-576-web-api-security-hardening branch August 17, 2026 08:52
Ibochkarev added a commit that referenced this pull request Aug 17, 2026
After rebase onto #584/#583: use CorsConfig::isOriginAllowed for preflight
smoke, and expect 500/internal mint failure instead of 401.
Ibochkarev added a commit that referenced this pull request Aug 17, 2026
After rebase onto #584/#583: use CorsConfig::isOriginAllowed for preflight
smoke, and expect 500/internal mint failure instead of 401.
Ibochkarev added a commit that referenced this pull request Aug 17, 2026
After rebase onto #584/#583: use CorsConfig::isOriginAllowed for preflight
smoke, and expect 500/internal mint failure instead of 401.
biz87 pushed a commit that referenced this pull request Aug 18, 2026
* test(web-api): add headless Nuxt journey suite via Router envelope

Catch storefront wire regressions (middleware, HTTP status, cart→login
transfer) that domain-only tests miss. Closes the Phase A+B gate for #574.

* fix(test): load Sqlite draft harness via bootstrap on Linux

PSR-4 maps Support/ but files live in tests/support/; CI is
case-sensitive and failed with trait not found (#595).

* test(web-api): align journey suite with beta CORS and mint contracts

After rebase onto #584/#583: use CorsConfig::isOriginAllowed for preflight
smoke, and expect 500/internal mint failure instead of 401.

* test(web-api): sync Journey token stubs with TokenMiddleware (#588)

After rebase onto beta with customer auth contract, middleware calls
syncSessionFromToken(); journey doubles must implement it.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working priority: high Важно исправить в ближайшее время

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] Web API: hardening rate-limit key, CORS wildcard match, token in query

2 participants