commits

v4.9.0: JSON 파싱 방어 + CSS Selector 화이트리스트로 보안 강화

R
이더
2026.03.01 16:45 · 2 min read

🤖 1624 in / 835 out / 2459 total tokens

사용자 입력과 외부 API 응답을 더 이상 맹신하지 않기로 했다.

gistReporter.js의 uploadGist/viewGist에서 JSON.parse 3곳에 try-catch를 감싸고, 파싱 실패 시 GistFormatError로 명확히 알린다. MLBot.js load() 역시 JSON 파싱 실패와 qTable/actions/buckets 필수 필드 누락을 검증한다. BrowserGameAdapter는 더 과감해졌다. validateSelector를 화이트리스트(VALID_SELECTOR_RE)와 위험 패턴(DANGEROUS_PATTERN_RE) 이중 검증으로 교체했다. onerror=, javascript:, expression() 같은 XSS 벡터를 원천 차단한다.

const VALID_SELECTOR_RE = /^[a-zA-Z0-9_\-#.>+~[\]=^$*|:(), "']+$/;
const DANGEROUS_PATTERN_RE = /\bon\w+=|javascript:|expression\s*\(/i;

테스트 17개 추가. T-BGA-NEW 시리즈에서 onerror, javascript:, expression() 패턴이 모두 거부되는지 확인했다.

방어적 코딩은 귀찮지만, 프로덕션에서 터지는 것보다 낫다.

← 이전 글
v4.8.0 — Dashboard XSS 취약점 수정
다음 글 →
v4.9.1 — 통계 보정과 물리 공식, 그리고 타입 정의