Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- html
- 인접리스트
- 코딩테스트
- nestjs
- Interceptor
- winston
- puppeteer
- REST API
- Linux
- java
- Deep Dive
- OOP
- 탐욕법
- typescript
- css
- Kubernetes
- javascript
- 자료구조
- node.js
- JWT
- GraphQL
- bean
- 프로그래머스
- Spring
- TIL
- dfs
- 알고리즘
- MySQL
- 인접행렬
- LifeCycle
Archives
- Today
- Total
처음부터 차근차근
Node.js 입출력 보안 맛보기 본문
728x90
1. 입력정보와 관련된 보안
Nodejs path parse를 검색해보면
path.parse() 메소드는 파일의 경로와 정보를 객체로 전달해준다.
이를 감추기 위해 path.parse().base를 입력하면
입력 정보를 세탁해줄 수 있다.
오염된 정보를 세탁하는 방법으로는
var filteredId = path.parse(queryData.id).base;
이 부분을 통해 입력정보에 대해 보안을 지킬 수 있다.
else {
fs.readdir('./data', function(error, filelist){
var filteredId = path.parse(queryData.id).base;
fs.readFile(`data/${filteredId}`, 'utf8', function(err, description){
var title = queryData.id;
var list = template.list(filelist);
var html = template.HTML(title, list,
`<h2>${title}</h2>${description}`,
` <a href="/create">create</a>
<a href="/update?id=${title}">update</a>
<form action="delete_process" method="post">
<input type="hidden" name="id" value="${title}">
<input type="submit" value="delete">
</form>`
);
response.writeHead(200);
response.end(html);
});
});
}
2. 출력정보와 관련된 보안
누군가 Update에 script를 통하여 공격하는것을 가정해보자.
Javascript를 통해 공격을 진행하는데, 이를 filtering을 해서 막을 수 있다.
1) 그냥 만든걸 지운다. => 매우 강력하지만, 인간이 해줘야 한다.
2) HTML entitles
<script> 이 부분에서 웹페이지에 < 을 나타낼라면, <를 넣어주자.
이 두가지는 수동으로 하는것으로, 매우 귀찮다.
3) NPM을 통해 다른사람이 만든 보안 모듈을 다운받자
npm sanitize html을 검색해보자. (Sanitize : 살균, 소독)
-> 검색해보면, 평판을 한번 보자
우리는 sanitize html을 가져와서 사용할거다.
npm init 을 통해 package.json 을 생성하자.
npm install -S sanitize-html (-S : 우리가 사용하는 프로젝트의 조각 ,-g는 global은 전역에서 사용)
var sanitizeHtml = require('sanitize-html');
var sanitizedTitle = sanitizeHtml(title);
var sanitizedDescription = sanitizeHtml(description, {
allowedTags:['h1']
});
sanitizedHtml을 활용해서 해당 title, description을 소독하였다.
SourceCode
var http = require('http');
var fs = require('fs');
var url = require('url');
var qs = require('querystring');
var template = require('./lib/template.js');
var path = require('path');
var sanitizeHtml = require('sanitize-html');
var app = http.createServer(function(request,response){
var _url = request.url;
var queryData = url.parse(_url, true).query;
var pathname = url.parse(_url, true).pathname;
if(pathname === '/'){
if(queryData.id === undefined){
fs.readdir('./data', function(error, filelist){
var title = 'Welcome';
var description = 'Hello, Node.js';
var list = template.list(filelist);
var html = template.HTML(title, list,
`<h2>${title}</h2>${description}`,
`<a href="/create">create</a>`
);
response.writeHead(200);
response.end(html);
});
} else {
fs.readdir('./data', function(error, filelist){
var filteredId = path.parse(queryData.id).base;
fs.readFile(`data/${filteredId}`, 'utf8', function(err, description){
var title = queryData.id;
var sanitizedTitle = sanitizeHtml(title);
var sanitizedDescription = sanitizeHtml(description, {
allowedTags:['h1']
});
var list = template.list(filelist);
var html = template.HTML(sanitizedTitle, list,
`<h2>${sanitizedTitle}</h2>${sanitizedDescription}`,
` <a href="/create">create</a>
<a href="/update?id=${sanitizedTitle}">update</a>
<form action="delete_process" method="post">
<input type="hidden" name="id" value="${sanitizedTitle}">
<input type="submit" value="delete">
</form>`
);
response.writeHead(200);
response.end(html);
});
});
}
} else if(pathname === '/create'){
fs.readdir('./data', function(error, filelist){
var title = 'WEB - create';
var list = template.list(filelist);
var html = template.HTML(title, list, `
<form action="/create_process" method="post">
<p><input type="text" name="title" placeholder="title"></p>
<p>
<textarea name="description" placeholder="description"></textarea>
</p>
<p>
<input type="submit">
</p>
</form>
`, '');
response.writeHead(200);
response.end(html);
});
} else if(pathname === '/create_process'){
var body = '';
request.on('data', function(data){
body = body + data;
});
request.on('end', function(){
var post = qs.parse(body);
var title = post.title;
var description = post.description;
fs.writeFile(`data/${title}`, description, 'utf8', function(err){
response.writeHead(302, {Location: `/?id=${title}`});
response.end();
})
});
} else if(pathname === '/update'){
fs.readdir('./data', function(error, filelist){
var filteredId = path.parse(queryData.id).base;
fs.readFile(`data/${filteredId}`, 'utf8', function(err, description){
var title = queryData.id;
var list = template.list(filelist);
var html = template.HTML(title, list,
`
<form action="/update_process" method="post">
<input type="hidden" name="id" value="${title}">
<p><input type="text" name="title" placeholder="title" value="${title}"></p>
<p>
<textarea name="description" placeholder="description">${description}</textarea>
</p>
<p>
<input type="submit">
</p>
</form>
`,
`<a href="/create">create</a> <a href="/update?id=${title}">update</a>`
);
response.writeHead(200);
response.end(html);
});
});
} else if(pathname === '/update_process'){
var body = '';
request.on('data', function(data){
body = body + data;
});
request.on('end', function(){
var post = qs.parse(body);
var id = post.id;
var title = post.title;
var description = post.description;
fs.rename(`data/${id}`, `data/${title}`, function(error){
fs.writeFile(`data/${title}`, description, 'utf8', function(err){
response.writeHead(302, {Location: `/?id=${title}`});
response.end();
})
});
});
} else if(pathname === '/delete_process'){
var body = '';
request.on('data', function(data){
body = body + data;
});
request.on('end', function(){
var post = qs.parse(body);
var id = post.id;
var filteredId = path.parse(id).base;
fs.unlink(`data/${filteredId}`, function(error){
response.writeHead(302, {Location: `/`});
response.end();
})
});
} else {
response.writeHead(404);
response.end('Not found');
}
});
app.listen(3000);
'FrameWork > Node.js' 카테고리의 다른 글
[Node.js] Node.js란? (0) | 2023.12.09 |
---|---|
Nodejs 객체와 모듈 이용해 정리정돈하기 (0) | 2023.05.31 |
Node.js Delete 구현 (0) | 2023.05.31 |
Node.js Update 진행해보기 (0) | 2023.05.31 |
Node.js App에서 Create 진행해보기 (0) | 2023.05.31 |