웹 사이트에 악성 스크립트를 삽입하여 의도하지 않은 명령을 실행시키는등 사용자에게 악영향을 끼칠수 있는 피해를 방지하는 목적입니다.
대부분 자바스크립트를 통해서 공격이 이루워지나, 공격 패턴이 너무 다양하여 완벽한 방어가 힘들다.
스크립트를 삽입하여 실행시키는 행위로 공격한다.
<script>
location.herf = '악성코드를 실행 시키는 페이지로 이동';
</script>
스크립트를 일차적으로 필터링 하는걸로 공격한다.
<scr<script>ipt>
location.herf = '악성코드를 실행 시키는 페이지로 이동';
</scr</script>ipt>
태그에서 특정 행동으로 공격한다.
<img src=0 onerror="javascript: alert('WARNING')">
<a onmouseover="alert('WARNING')">
잘 사용하지 않는 태그를 사용하여 공격한다.
<ruby onmouseover="alert('WARNING')"></ruby>
DOCTYPE에 취약점 삽입 공격한다.
<!DOCTYPE xss [
<!ENTITY x "<script>alert('WARNING')</script>">
]>
<html xmlns="http://www.w3.org/1999/xhtml">
등등... 너무 많은 유형의 공격방법이 존재한다.
v-html을 사용하는 부분이 조금씩 있었는데, 사용은 열심히 하였지만, 중요한 내용을 지나치고 있었다.
vue2, typescript 사용함.
1. vue-dompurify-html
2. class-transformer
3. dompurify
v-html
대신 v-dompurify-html
사용한다.// AS-IS
<div v-html="htmlStr"></div>
// TO-BE
<div v-dompurify-html="htmlStr"></div>
// Request 모델
@Expose()
@XssRequest()
xssRequestItem!: string;
// Response 모델
@Expose()
@XssResponse()
xssResponseItem!: string;
// XssRequest Decorator
Transform(value => decoratorEncodeXss(value), {toPlainOnly: true})();
// XssResponse Decorator
Transform(value => decoratorDecodeXss(value), {toClassOnly: true})();
// action
@ToPlain()
actions(params) {
// 데코레이터의 역활로 params는 class -> plain으로 변경되어 진입됨
http.post(`/actions`, params).then(response => {
// response mutation
});
}
// getter
getter() {
return plainToInstance(T, state);
}
// ToPlain Decorator
...
instanceToPlain(arg)
...
그렇다 하더라도 텍스트로 입력한 내용에 HTML내용이 들어가지 않을수 없다.
그래서 표현하는 부분에서 innmerText로 입력할지, innerHTML로 입력할지를 선택해서 수정하였다.
만약에 관리자가 잘못 입력하더라도 <
>
로 표현되지 않고 텍스트<
>
로 표현하도록 하였다.