Skip to content

Commit 2882b69

Browse files
committed
야, 보안 강화하고 에러 페이지 제대로 만들었어
add-channel이랑 remove-channel에 본인 확인 로직 추가했고, 남의 계정 건드리면 403 띄우면서 자기 페이지로 튕겨버린다. 그리고 에러 페이지는 완전 맨땅이었는데 제대로 된 HTML 구조로 다시 짰어. favicon, 스타일시트 다 넣고, production 환경에선 stack trace 안 보이게 처리했다.
1 parent 0fdaf06 commit 2882b69

2 files changed

Lines changed: 40 additions & 3 deletions

File tree

web/routes/index.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,13 @@ router.get('/@:username/manage', connectEnsureLogin.ensureLoggedIn(), async (req
242242
});
243243

244244
router.post('/@:username/add-channel', connectEnsureLogin.ensureLoggedIn(), async (req, res) => {
245+
const { username } = req.params;
246+
247+
// 본인만 채널 추가 가능
248+
if (req.user.username !== username) {
249+
return res.status(403).redirect(`/@${req.user.username}/manage`);
250+
}
251+
245252
let { channelUrl } = req.body;
246253

247254
// URL 디코딩 (한글 등 인코딩된 문자 처리)
@@ -333,8 +340,15 @@ router.post('/@:username/add-channel', connectEnsureLogin.ensureLoggedIn(), asyn
333340
});
334341

335342
router.post('/@:username/remove-channel', connectEnsureLogin.ensureLoggedIn(), async (req, res) => {
343+
const { username } = req.params;
336344
const { channelId } = req.body;
337345
const user = req.user;
346+
347+
// 본인만 삭제 가능
348+
if (user.username !== username) {
349+
return res.status(403).redirect(`/@${user.username}/manage`);
350+
}
351+
338352
await dao.removeChannelFromAccount(user.accountId, channelId);
339353
res.redirect(`/@${req.user.username}/manage`);
340354
});

web/views/error.ejs

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,26 @@
1-
<h1><%= message %></h1>
2-
<h2><%= error.status %></h2>
3-
<pre><%= error.stack %></pre>
1+
<!DOCTYPE html>
2+
<html lang="ko">
3+
<head>
4+
<title>Error - <%= error.status %></title>
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6+
<link rel="apple-touch-icon" sizes="180x180" href="/favicon/apple-touch-icon.png">
7+
<link rel="icon" type="image/png" sizes="32x32" href="/favicon/favicon-32x32.png">
8+
<link rel="icon" type="image/png" sizes="16x16" href="/favicon/favicon-16x16.png">
9+
<link rel="manifest" href="/favicon/site.webmanifest">
10+
<link rel='stylesheet' href='/css/style.css' />
11+
</head>
12+
<body>
13+
<section id="title">
14+
<h1 class="title">
15+
<a href="/">Error - <%= error.status %></a>
16+
</h1>
17+
</section>
18+
<div style="padding: 2rem; text-align: center;">
19+
<p><%= message %></p>
20+
<% if (process.env.NODE_ENV !== 'production') { %>
21+
<pre style="text-align: left; background: #f5f5f5; padding: 1rem; overflow: auto; max-width: 800px; margin: 1rem auto;"><%= error.stack %></pre>
22+
<% } %>
23+
<p><a href="/">홈으로 돌아가기</a></p>
24+
</div>
25+
</body>
26+
</html>

0 commit comments

Comments
 (0)