XSS(Cross Site Scripting) 특수 문자열 변환(parsing)

XSS(Cross Site Scripting)

XSS(Cross Site Scripting) 사이트 간 스크립팅이라고 불리는 공격에 대해서는 다른 블로거들이 정리를 잘 해놓았으니, 검색해서 알아보자. 필자는 DataBase 내 정상적으로 적재된 특수 문자열을 XSS 방어를 위해 별도 변환(parsing)을 한다. 마침 변환에 필요한 자료를 잘 정리하신 블로거 분이 계시니, 참고 바라며(최하단 출처에 기재). 하단에 기술된 내용은 필자가 사용하기 위해 별도 가공한 결과물을 공유하는 바이다.

 


 

XSS escape Object

필자는 javascript를 통하여 미리 선언한 함수로 특수문자의 안전한 XSS excape를 시켜준다. 지역 변수로 해당 과정에 필요한 값들을 Object 형태로 담아두는데, 아래와 같다.

let escapeText = {
	"nbsp"     : " ",
	"OElig"    : "Œ",
	"oelig"    : "œ",
	"Scaron"   : "Š",
	"scaron"   : "š",
	"Yuml"     : "Ÿ",
	"fnof"     : "ƒ",
	"circ"     : "ˆ",
	"tilde"    : "˜",
	"ensp"     : " ",
	"emsp"     : " ",
	"thinsp"   : " ",
	"zwnj"     : "‌",
	"zwj"      : "?",
	"lrm"      : "‎",
	"rlm"      : "‏",
	"ndash"    : "–",
	"mdash"    : "—",
	"lsquo"    : "‘",
	"rsquo"    : "’",
	"sbquo"    : "‚",
	"ldquo"    : "“",
	"rdquo"    : "”",
	"bdquo"    : "„",
	"dagger"   : "†",
	"Dagger"   : "‡",
	"bull"     : "•",
	"hellip"   : "…",
	"permil"   : "‰",
	"prime"    : "′",
	"Prime"    : "″",
	"lsaquo"   : "‹",
	"rsaquo"   : "›",
	"oline"    : "‾",
	"euro"     : "€",
	"trade"    : "™",
	"larr"     : "←",
	"uarr"     : "↑",
	"rarr"     : "→",
	"darr"     : "↓",
	"harr"     : "↔",
	"crarr"    : "↵",
	"lceil"    : "⌈",
	"rceil"    : "⌉",
	"lfloor"   : "⌊",
	"rfloor"   : "⌋",
	"loz"      : "◊",
	"spades"   : "♠",
	"clubs"    : "♣",
	"hearts"   : "♥",
	"diams"    : "♦",
	"Alpha"    : "Α",
	"Beta"     : "Β",
	"Gamma"    : "Γ",
	"Delta"    : "Δ",
	"Epsilon"  : "Ε",
	"Zeta"     : "Ζ",
	"Eta"      : "Η",
	"Theta"    : "Θ",
	"Iota"     : "Ι",
	"Kappa"    : "Κ",
	"Lambda"   : "Λ",
	"Mu"       : "Μ",
	"Nu"       : "Ν",
	"Xi"       : "Ξ",
	"Omicron"  : "Ο",
	"Pi"       : "Π",
	"Rho"      : "Ρ",
	"Sigma"    : "Σ",
	"Tau"      : "Τ",
	"Upsilon"  : "Υ",
	"Phi"      : "Φ",
	"Chi"      : "Χ",
	"Psi"      : "Ψ",
	"Omega"    : "Ω",
	"alpha"    : "α",
	"beta"     : "β",
	"gamma"    : "γ",
	"delta"    : "δ",
	"epsilon"  : "ε",
	"zeta"     : "ζ",
	"eta"      : "η",
	"theta"    : "θ",
	"iota"     : "ι",
	"kappa"    : "κ",
	"lambda"   : "λ",
	"mu"       : "μ",
	"nu"       : "ν",
	"xi"       : "ξ",
	"omicron"  : "ο",
	"pi"       : "π",
	"rho"      : "ρ",
	"sigmaf"   : "ς",
	"sigma"    : "σ",
	"tau"      : "τ",
	"upsilon"  : "υ",
	"phi"      : "φ",
	"chi"      : "χ",
	"psi"      : "ψ",
	"omega"    : "ω",
	"thetasym" : "ϑ",
	"upsih"    : "ϒ",
	"piv"      : "ϖ",
	"forall"   : "∀",
	"part"     : "∂",
	"exist"    : "∃",
	"empty"    : "∅",
	"nabla"    : "∇",
	"isin"     : "∈",
	"notin"    : "∉",
	"ni"       : "∋",
	"prod"     : "∏",
	"sum"      : "∑",
	"minus"    : "−",
	"lowast"   : "∗",
	"radic"    : "√",
	"prop"     : "∝",
	"infin"    : "∞",
	"ang"      : "∠",
	"and"      : "∧",
	"or"       : "∨",
	"cap"      : "∩",
	"cup"      : "∪",
	"int"      : "∫",
	"there4"   : "∴",
	"sim"      : "∼",
	"cong"     : "≅",
	"asymp"    : "≈",
	"ne"       : "≠",
	"equiv"    : "≡",
	"le"       : "≤",
	"ge"       : "≥",
	"sub"      : "⊂",
	"sup"      : "⊃",
	"nsub"     : "⊄",
	"sube"     : "⊆",
	"supe"     : "⊇",
	"oplus"    : "⊕",
	"otimes"   : "⊗",
	"perp"     : "⊥",
	"sdot"     : "⋅",
	"nbsp"     : " ",
	"iexcl"    : "¡",
	"cent"     : "¢",
	"pound"    : "£",
	"curren"   : "¤",
	"yen"      : "¥",
	"brvbar"   : "|",
	"sect"     : "§",
	"uml"      : "¨",
	"copy"     : "ⓒ",
	"ordf"     : "ª",
	"laquo"    : "≪",
	"not"      : "¬",
	"shy"      : "­",
	"reg"      : "®",
	"macr"     : "¯",
	"deg"      : "°",
	"plusmn"   : "±",
	"sup2"     : "²",
	"sup3"     : "³",
	"acute"    : "´",
	"micro"    : "μ",
	"para"     : "¶",
	"cedil"    : "¸",
	"sup1"     : "¹",
	"ordm"     : "º",
	"raquo"    : "≫",
	"frac14"   : "¼",
	"frac12"   : "½",
	"frac34"   : "¾",
	"iquest"   : "¿",
	"times"    : "×",
	"divide"   : "÷",
	"Agrave"   : "A",
	"Aacute"   : "A",
	"Acirc"    : "A",
	"Atilde"   : "A",
	"Auml"     : "A",
	"Aring"    : "A",
	"AElig"    : "Æ",
	"Ccedil"   : "C",
	"Egrave"   : "E",
	"Eacute"   : "E",
	"Ecirc"    : "E",
	"Euml"     : "E",
	"Igrave"   : "I",
	"Iacute"   : "I",
	"Icirc"    : "I",
	"Iuml"     : "I",
	"ETH"      : "Ð",
	"Ntilde"   : "N",
	"Ograve"   : "O",
	"Oacute"   : "O",
	"Ocirc"    : "O",
	"Otilde"   : "O",
	"Ouml"     : "O",
	"Oslash"   : "Ø",
	"Ugrave"   : "U",
	"Uacute"   : "U",
	"Ucirc"    : "U",
	"Uuml"     : "U",
	"Yacute"   : "Y",
	"THORN"    : "Þ",
	"szlig"    : "ß",
	"agrave"   : "a",
	"aacute"   : "a",
	"acirc"    : "a",
	"atilde"   : "a",
	"auml"     : "a",
	"aring"    : "a",
	"aelig"    : "æ",
	"ccedil"   : "c",
	"egrave"   : "e",
	"eacute"   : "e",
	"ecirc"    : "e",
	"euml"     : "e",
	"igrave"   : "i",
	"iacute"   : "i",
	"icirc"    : "i",
	"iuml"     : "i",
	"eth"      : "ð",
	"ntilde"   : "n",
	"ograve"   : "o",
	"oacute"   : "o",
	"ocirc"    : "o",
	"otilde"   : "o",
	"ouml"     : "o",
	"oslash"   : "ø",
	"ugrave"   : "u",
	"uacute"   : "u",
	"ucirc"    : "u",
	"uuml"     : "u",
	"yacute"   : "y",
	"thorn"    : "þ",
	"yuml"     : "y",
	"amp"      : "&",
	"lt"       : "<",
	"gt"       : ">",
	"middot"   : "·"
};

사용 방법은 다음과 같다.

 

  1. 해당 Object 내의 key 에 해당하는 문자열이 확인되었을 경우
  2. value 에 해당하는 문자열로 치환하여(replace)
  3. 반환한다.

 


 

XSS escape 전 후

BackEnd 혹은 FrontEnd 영역에서 XSS excape가 정상적으로 되지 않았을 경우, 다음과 같이 출력된다.

&bull; 이러한 &lt;까닭&gt;으로
&bull; XSS excape 과정이
&bull; 필요합니다.
• 이러한 <까닭>으로
• XSS excape 과정이
• 필요합니다.

 


 

entity Excel

출처에 기재된 블로그 내 표를 혹여나 하는 마음으로(유실되는 등의 까닭) 엑셀로 담아두었다. 다시 한 번 해당 표를 작성해주신 선비님께 감사를 표한다.

XSS parsing entity.xlsx
0.02MB

 

 

 


 

 

 

[ 출처 ]

HTML 특수문자표 : (선비님 블로그) https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=kscco&logNo=140025516504

728x90