Security-хардening: XSS в никах, non-root контейнер, rate-limiting, спавн-фикс
Клиент: ники других игроков рендерились через 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).
This commit is contained in:
@@ -1,9 +1,20 @@
|
||||
# на IP: не более 5 новых /ws соединений в секунду, всплеск до 10 без задержки
|
||||
limit_req_zone $binary_remote_addr zone=ws_connect:10m rate=5r/s;
|
||||
# на IP: не более 20 одновременных /ws соединений — не даёт одному клиенту
|
||||
# открыть тысячи сокетов и завалить lobby.create_room комнатами до OOM
|
||||
limit_conn_zone $binary_remote_addr zone=ws_conn:10m;
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name cactoz.su www.cactoz.su;
|
||||
root /usr/share/nginx/html;
|
||||
index index.html;
|
||||
|
||||
add_header X-Content-Type-Options nosniff always;
|
||||
add_header X-Frame-Options DENY always;
|
||||
add_header Referrer-Policy strict-origin-when-cross-origin always;
|
||||
add_header Content-Security-Policy "default-src 'self'; connect-src 'self' wss://cactoz.su wss://www.cactoz.su; img-src 'self' data:; style-src 'self' 'unsafe-inline'; base-uri 'none'; frame-ancestors 'none'" always;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri.html $uri/ =404;
|
||||
}
|
||||
@@ -15,6 +26,9 @@ server {
|
||||
}
|
||||
|
||||
location /ws {
|
||||
limit_req zone=ws_connect burst=10 nodelay;
|
||||
limit_conn ws_conn 20;
|
||||
|
||||
proxy_pass http://gameserver:9001;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
|
||||
Reference in New Issue
Block a user