Клиент: ники других игроков рендерились через 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).
26 lines
1.3 KiB
Docker
26 lines
1.3 KiB
Docker
FROM debian:bookworm AS build
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
build-essential cmake git ca-certificates zlib1g-dev \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
WORKDIR /app
|
|
|
|
# Кэшируемый слой: конфигурация + сборка зависимостей (uSockets, json).
|
|
# Заглушки вместо src/, чтобы cmake configure не падал на несуществующих
|
|
# исходниках — они не компилируются, т.к. просим собрать только usockets.
|
|
COPY CMakeLists.txt ./
|
|
RUN mkdir src && touch src/main.cpp src/Lobby.cpp src/Lobby.hpp src/Game.cpp src/Game.hpp
|
|
RUN cmake -B build -DCMAKE_BUILD_TYPE=Release && cmake --build build --target usockets -j"$(nproc)"
|
|
|
|
# Реальный код поверх уже собранных зависимостей — пересобирается за секунды.
|
|
COPY src ./src
|
|
RUN cmake --build build --target gameserver -j"$(nproc)"
|
|
|
|
FROM debian:bookworm-slim
|
|
RUN apt-get update && apt-get install -y --no-install-recommends zlib1g \
|
|
&& rm -rf /var/lib/apt/lists/* \
|
|
&& useradd --system --no-create-home --shell /usr/sbin/nologin gameserver
|
|
COPY --from=build /app/build/gameserver /usr/local/bin/gameserver
|
|
USER gameserver
|
|
EXPOSE 9001
|
|
CMD ["gameserver"]
|