fix: ревью онлайн-урока — 8 исправлений багов, уязвимостей и улучшений

- draw_permitted: emit→emitToUser (WS доставка вместо SSE-only)
- raised hands: убран in-memory Map, единый источник — таблица classroom_hands
- endSession: очистка classroom_hands при завершении сессии
- VALID_THEMES: исправлен список (добавлен corkboard, убраны dark/grid/dots)
- XSS: crLoadOnlineStudents — inline onclick заменён на data-* + addEventListener
- signal(): проверка что target_user_id является участником сессии
- WS rate-limit: 120 msg/sec per connection
- invalidateSession при join/leave для мгновенной видимости новых участников

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-04-16 09:02:50 +03:00
parent 847e9b9b4f
commit f1e6ed7f2d
3 changed files with 32 additions and 14 deletions
+8
View File
@@ -289,7 +289,15 @@ function attach(httpServer) {
ws.on('pong', () => { ws.isAlive = true; });
ws._msgCount = 0;
ws._msgWindowStart = Date.now();
ws.on('message', raw => {
// Rate-limit: max 120 messages per second per connection
const now = Date.now();
if (now - ws._msgWindowStart > 1000) { ws._msgCount = 0; ws._msgWindowStart = now; }
if (++ws._msgCount > 120) return;
let msg;
try { msg = JSON.parse(raw); } catch { return; }
try { _handleMessage(ws, msg); } catch (e) {