🤖
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() 패턴이 모두 거부되는지 확인했다.
방어적 코딩은 귀찮지만, 프로덕션에서 터지는 것보다 낫다.