가끔은 서버 측에서 인라인 JavaScript 코드에 포함 할 문자열을 생성합니다. 예를 들어 ASP.NET에서 "UserName"을 생성해야합니다. 그러면 그것은 마치 보입니다. 사용자가 그것은 XSS 취약점입니다javascript 문자열에 "<" and ">"문자를 "이스케이프"해야합니까?
</script><script>alert('bug')</script></script>
될 그/그녀의 이름을 가질 수 있기 때문에
<script>
var username = "<%UserName%>";
</script>
이는 안전하지 않습니다.
그래서, 기본적으로, 코드가 있어야한다 : JavascriptEncode이 무엇
<script>
var username = "<% JavascriptEncode(UserName)%>";
</script>
가 charater을 추가하는 것입니다 "\" "/"와 " '"와 "" "그래서, 출력 HTML 전에. 처럼 var에 사용자 이름 = "</스크립트> 경고 (\ '버그 \') </script> </스크립트>";. 이
브라우저 "해석되지 않습니다/script> "을 스크립트 블록의 끝으로 사용하십시오. 따라서 XSS는 피해졌습니다.
그러나 여전히 "<"및 ">"이 있습니다. 이 두 문자를 이스케이프 처리하는 것이 좋습니다. 우선, "<"을 "& lt;"으로 변경하는 것이 좋습니다. 및 ">"~ "& gt;" 이리. 그리고 "<"을 "\ <"으로 변경하고 ">"을 "\>"으로 변경하는 것이 모든 브라우저에서 인식되는지 확신 할 수 없습니다. "<"및 ">"에 대한 추가 인코딩은 필요하지 않습니다.
이 문제에 대한 제안 사항이 있습니까?
감사합니다.
그러나 CDATA 블록 내부의']''여전히'>'은'>'에 의해 repalce되어야합니다. 그래서'foo [bar [0]]> 1234'는'foo [bar [0]] < 1234' 또는'foo [bar [0]]> 1234'로 대체되어야합니다. 그렇지 않으면 CDATA 블록이 너무 일찍 닫힙니다. – Gumbo
CDATA는 & 문자를 "&"을 의미하고 "엔터티의 시작"을 의미하지 않으므로 작동하지 않습니다. 만약 당신이 문자열을 표현할 필요가 있다면 "]]>"CDATA 안에서 나는 꽤 빠르다. CDATA 블록 밖에서 시작하기 위해 엔티티를 사용해야한다. – Quentin
아니면 공백을 추가한다 :'foo [bar [0 ]]> 1234' - 또는 문자열의 일부인 'foo [bar [0]]'+ '> 1234''이거나 외부 .js 파일에 모든 스크립트를 포함하는 경우. – gnarf