28 lines
1.6 KiB
Text
28 lines
1.6 KiB
Text
P8-REVIEW, ось 2: SSE-хендшейк не проверяет Origin. Живая проба 24.08.2026, дев-демон 127.0.0.1:8099.
|
||
|
||
$ curl -i -b <cookie-jar> -H "Origin: https://evil.example" -H "Accept: text/event-stream" http://127.0.0.1:8099/v0/books/<id>/events
|
||
HTTP/1.1 200 OK
|
||
Cache-Control: no-store
|
||
Content-Security-Policy: default-src 'none'; frame-ancestors 'none'
|
||
Content-Type: text/event-stream
|
||
Referrer-Policy: no-referrer
|
||
X-Accel-Buffering: no
|
||
X-Content-Type-Options: nosniff
|
||
X-Frame-Options: DENY
|
||
X-Request-Id: FH32M4OJU5TUOITX
|
||
X-Robots-Tag: noindex, nofollow
|
||
Date: Mon, 24 Aug 2026 18:05:43 GMT
|
||
Transfer-Encoding: chunked
|
||
|
||
event: hello
|
||
|
||
$ тот же запрос БЕЗ куки -> код ответа:
|
||
401
|
||
|
||
Заголовка X-TM-Client в запросе НЕТ, и он не потребован: auth.cookieUnsafe освобождает GET
|
||
(internal/auth/csrf.go, switch по методу), а http.CrossOriginProtection судит только unsafe-методы.
|
||
Что при этом РЕАЛЬНО закрывает браузерный случай и чем удерживается: кука SameSite=Lax
|
||
(internal/auth/cookie.go, set) не уходит на кросс-сайтовый подзапрос, префикс __Host- не даёт
|
||
её соседнему поддомену, а CORS-слоя нет вовсе (PD-96), поэтому кросс-origin EventSource
|
||
браузер и так не отдаст странице. Защита есть, но она ТРАНЗИТИВНА и ни одним тестом как
|
||
защита хендшейка не пинится — класс PD-86.
|