Security hardening: escape names in result screens, drop tech-stack headers
- Escape player names rendered via innerHTML on the hand-over and game-over
score rows (defense-in-depth XSS; names are already capped at 16 chars)
- app.disable('x-powered-by') to stop advertising Express
- Add safe response headers: X-Content-Type-Options, X-Frame-Options,
Referrer-Policy (no CSP — inline SW script + socket.io would need unsafe-inline)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+2
-2
@@ -1179,7 +1179,7 @@ function onHandOver(st) {
|
||||
const isWinner = mySeat >= 0 && teamOf(mySeat) === team && delta > 0;
|
||||
if (isWinner) row.classList.add('winner');
|
||||
row.innerHTML = `
|
||||
<span class="team-label">${names}</span>
|
||||
<span class="team-label">${escHtml(names)}</span>
|
||||
<span class="delta ${delta >= 0 ? 'pos' : 'neg'}">${delta >= 0 ? '+' : ''}${delta}</span>
|
||||
<span style="color:rgba(255,255,255,.6);font-size:.8rem">→ ${st.scores[team]}</span>
|
||||
`;
|
||||
@@ -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 = `<span>${names}</span><span style="font-weight:700;color:${team===0?'var(--team-a)':'var(--team-b)'}">${st.scores[team]}</span>`;
|
||||
row.innerHTML = `<span>${escHtml(names)}</span><span style="font-weight:700;color:${team===0?'var(--team-a)':'var(--team-b)'}">${st.scores[team]}</span>`;
|
||||
scoresEl.appendChild(row);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user