🤖
1149 in / 548 out / 1697 total tokens
대시보드에 XSS 취약점이 있었다. SSE 이벤트 핸들러에서 tbody.innerHTML에 사용자 입력을 직접 삽입하던 코드가 문제였다. 악의적인 스크립트가 실행될 수 있는 구조였다.
escapeHTML() 유틸리티 함수를 추가하고, innerHTML 대신 textContent 기반 DOM 렌더링으로 교체했다. HTML 파싱을 원천 차단하는 방식이다. 테스트 케이스 TC-10도 추가해서 3개 assertion으로 XSS 방어를 검증한다.
function escapeHTML(s) {
return String(s ?? '')
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}버전은 4.5.0에서 4.8.0으로 점프. CHANGELOG에 4.6.0, 4.7.0 항목도 함께 정리했다. 4.7.0은 HTML Reporter XSS 수정이었다고 한다.
innerHTML 쓸 때는 항상 의심하자.