create account

웹브라우저 및 Node.js 에서 XSS 공격 막기 by inspiredjw

View this thread on: hive.blogpeakd.comecency.com
· @inspiredjw · (edited)
$20.83
웹브라우저 및 Node.js 에서 XSS 공격 막기
**XSS (Cross-Site Scripting 크로스 사이트 스크립팅)** 은 사용자가 입력할 수 있는 폼이나

URL의 파라미터 값을 통해 악의적인 코드를 삽입하여

쿠키를 갈취하거나 악성 코드를 실행하는 것을 말합니다.

![](https://steemitimages.com/DQmcS5P94gcjVRLd6N44opYVzouqzNENSwzVQ5gUfB2qaRD/image.png)

> 사이트 간 스크립팅(또는 크로스 사이트 스크립팅, 영문 명칭 cross-site scripting, 영문 약어 XSS)은 웹 애플리케이션에서 많이 나타나는 취약점의 하나로 웹사이트 관리자가 아닌 이가 웹 페이지에 악성 스크립트를 삽입할 수 있는 취약점이다.
> 주로 여러 사용자가 보게 되는 전자 게시판에 악성 스크립트가 담긴 글을 올리는 형태로 이루어진다.
> 이 취약점은 웹 애플리케이션이 사용자로부터 입력 받은 값을 제대로 검사하지 않고 사용할 경우 나타난다.
> 이 취약점으로 해커가 사용자의 정보(쿠키, 세션 등)를 탈취하거나, 자동으로 비정상적인 기능을 수행하게 하거나 할 수 있다.
> 주로 다른 웹사이트와 정보를 교환하는 식으로 작동하므로 사이트 간 스크립팅이라고 한다.
> ##### [사이트 간 스크립팅 - Wikipedia](https://ko.wikipedia.org/wiki/%EC%82%AC%EC%9D%B4%ED%8A%B8_%EA%B0%84_%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8C%85)

<br>

기본적으로 이는 태그, 특히 스크립트 태그를 통해 삽입되어 지는데요.

태그를 여는 `<` 를 `&lt;` 로 `>` 를 `&gt;` 로 표현함으로써

브라우저가 진짜 태그가 아닌 문자 형태의 `<` 와 `>` 로 인식하게 할 수 있습니다.

<br>

이 방법으로 XSS 필터링을 해줄 수 있습니다.

```javascript
function XSSFilter(content) {
  return content.replace(/</g, "&lt;").replace(/>/g, "&gt;");
}
```
<br>
기본 원리는 이와 같이 실제 태그가 아닌 문자로 변경해줌으로써 태그나 코드를 주입 못하게 하는 것인데요.
사실 저 2개만으로는 XSS 공격을 제대로 막기에는 좀 부족합니다.

실제로 좀 더 확실한 방법으로 필터링 하고자 한다면 기존에 있는 오픈소스를 이용하는 것이 좋습니다.

> 여기서 저는 js-xss 라는 오픈소스를 선택하였습니다.
> GitHub: https://github.com/leizongmin/js-xss

#### Browser
```xml
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-xss/0.3.3/xss.min.js"></script>
<script>
var html = filterXSS('<script>alert("xss");</scr' + 'ipt>');
alert(html);
</script>
```

#### Node.js
```javascript
var xss = require('xss');
var html = xss('<script>alert("xss");</script>');
console.log(html);
```

Node.js 의 장점이 Front-end와 Back-end 언어가 같다는 점을 생각하면

이 코드는 HTML + CSS + JavaScript 또는 Node.js 양쪽 모두에서 동일하게 사용할 수 있습니다.
👍  , , , , , , , , ,
properties (23)
authorinspiredjw
permlinknode-js-xss
categorytechnology
json_metadata{"tags":["technology","kr","security","internet","kr-dev"],"image":["https://steemitimages.com/DQmcS5P94gcjVRLd6N44opYVzouqzNENSwzVQ5gUfB2qaRD/image.png"],"links":["https://ko.wikipedia.org/wiki/%EC%82%AC%EC%9D%B4%ED%8A%B8_%EA%B0%84_%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8C%85","https://github.com/leizongmin/js-xss"],"app":"steemit/0.1","format":"markdown"}
created2017-06-22 08:50:03
last_update2017-06-22 16:11:33
depth0
children2
last_payout2017-06-29 08:50:03
cashout_time1969-12-31 23:59:59
total_payout_value16.206 HBD
curator_payout_value4.620 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length1,722
author_reputation836,711,962,277
root_title"웹브라우저 및 Node.js 에서 XSS 공격 막기"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id5,605,239
net_rshares1,570,575,084,548
author_curate_reward""
vote details (10)
@coinkorea ·
글 감사합니다^^ 개발 태그로 #kr-dev 태그를 추가하시면 더 많은 분들이 보실 수 있을 것 같습니다 :)
properties (22)
authorcoinkorea
permlinkre-inspiredjw-node-js-xss-20170622t115134394z
categorytechnology
json_metadata{"tags":["kr-dev","technology"],"app":"steemit/0.1"}
created2017-06-22 11:51:33
last_update2017-06-22 11:51:33
depth1
children0
last_payout2017-06-29 11:51:33
cashout_time1969-12-31 23:59:59
total_payout_value0.000 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length61
author_reputation34,890,178,701,093
root_title"웹브라우저 및 Node.js 에서 XSS 공격 막기"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id5,619,468
net_rshares0
@iamstevechang ·
$0.67
점점 Steemit에도 전문성있는 글들이 많이 생겨나네요 ㅎㅎ
👍  
properties (23)
authoriamstevechang
permlinkre-inspiredjw-node-js-xss-20170622t090324832z
categorytechnology
json_metadata{"tags":["technology"],"app":"steemit/0.1"}
created2017-06-22 09:03:24
last_update2017-06-22 09:03:24
depth1
children0
last_payout2017-06-29 09:03:24
cashout_time1969-12-31 23:59:59
total_payout_value0.674 HBD
curator_payout_value0.000 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length34
author_reputation16,755,017,489,957
root_title"웹브라우저 및 Node.js 에서 XSS 공격 막기"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id5,606,178
net_rshares50,969,796,525
author_curate_reward""
vote details (1)