diff --git a/package.json b/package.json
index f7cc3e3..86a9823 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "shelem",
- "version": "1.1.6",
+ "version": "1.1.7",
"description": "Shelem card game — multiplayer",
"main": "server.js",
"scripts": {
diff --git a/public/app.js b/public/app.js
index 8fafce9..4478ac8 100644
--- a/public/app.js
+++ b/public/app.js
@@ -1179,7 +1179,7 @@ function onHandOver(st) {
const isWinner = mySeat >= 0 && teamOf(mySeat) === team && delta > 0;
if (isWinner) row.classList.add('winner');
row.innerHTML = `
- ${names}
+ ${escHtml(names)}
${delta >= 0 ? '+' : ''}${delta}
→ ${st.scores[team]}
`;
@@ -1211,7 +1211,7 @@ function onGameOver(st) {
.filter(Boolean).join(' & ') || `Team ${team + 1}`;
const row = document.createElement('div');
row.className = 'gameover-row' + (winTeams.has(team) ? ' winner' : '');
- row.innerHTML = `${names}${st.scores[team]}`;
+ row.innerHTML = `${escHtml(names)}${st.scores[team]}`;
scoresEl.appendChild(row);
}
diff --git a/server.js b/server.js
index 7ae70a7..0323431 100644
--- a/server.js
+++ b/server.js
@@ -10,6 +10,17 @@ const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const app = express();
+app.disable('x-powered-by'); // don't advertise the tech stack
+
+// Safe security headers (no CSP here — inline SW script + socket.io would need
+// 'unsafe-inline'/wss exceptions; Cloudflare already terminates TLS/HSTS)
+app.use((_req, res, next) => {
+ res.setHeader('X-Content-Type-Options', 'nosniff');
+ res.setHeader('X-Frame-Options', 'DENY');
+ res.setHeader('Referrer-Policy', 'no-referrer');
+ next();
+});
+
const httpServer = http.createServer(app);
let httpsServer = null;