Клиент: ники других игроков рендерились через innerHTML без экранирования — XSS.
Добавлен escapeHtml() для nickname и в списке игроков комнаты.
Сервер:
- Санитайзинг ника и на бэкенде (обрезка длины, вырезание control/HTML
символов) — защита не только для этого клиента, но и для любых будущих
потребителей (логи, другие рендеры).
- onMessage обёрнут в try/catch: payload.value<T>() кидает json::type_error
на несовпадении типа поля — одно кривое сообщение могло уронить процесс
со всеми активными играми.
- Лимит на общее число комнат (200) — иначе клиент, спамящий
lobby.create_room, разгонял rooms_ до исчерпания памяти.
- Fix: одна из раскладок coop-карты клала укрытие поверх стартовой позиции
игрока — танк рождался внутри кирпича и не мог выехать. Тайл под каждым
стартовым танком теперь расчищается после построения карты.
Docker: gameserver теперь работает от непривилегированного пользователя,
а не от root.
nginx: rate-limiting на /ws (5 подключений/с на IP, до 20 одновременных) —
защита от флуда соединениями/комнатами; CSP и security-заголовки
(X-Content-Type-Options, X-Frame-Options, Referrer-Policy).