ðNode.js Expressã§ã®ç·åœããæ»æå¯Ÿç
This post hasn't been updated for 2 years
1. ã¯ããã«
ç·åœããæ»æã¯ããŠã§ãéçºã®äžçã§äžè¬çãªã»ãã¥ãªãã£è åšã§ããããã¯ããã¹ã¯ãŒããè§£èªããããå¶éããããšãªã¢ã«ã¢ã¯ã»ã¹ãããããããã«ãæåã®ãã¹ãŠã®çµã¿åãããé çªã«è©Šãæ¹æ³ã§ãããã®èšäºã§ã¯ãNode.js Expressã¢ããªã±ãŒã·ã§ã³ãç·åœããæ»æããä¿è·ããããã®å æ¬çãªã¬ã€ããæäŸããŸãã
1.1 ç·åœããæ»æãšã¯ïŒ
ç·åœããæ»æãšã¯ãæ»æè ãã·ã¹ãã ãžã®äžæ£ãªã¢ã¯ã»ã¹ã詊ã¿ãæ¹æ³ã§ããã¹ãŠã®ãŠãŒã¶ãŒåãšãã¹ã¯ãŒãã®çµã¿åãããé çªã«è©Šãããšã§ãæ£ãããã®ãèŠã€ããããšãç®çãšããŠããŸãããã®ã¿ã€ãã®æ»æã¯ãæéãããããªãœãŒã¹ãæ¶è²»ããããšããããŸããã察象ãšãªãã·ã¹ãã ã«é©åãªã»ãã¥ãªãã£å¯Ÿçãæ¬ ããŠããå Žåã¯æåããããšããããŸãã
1.2 Node.js Expressã®æŠèŠ
Node.js Expressã¯ãã¹ã±ãŒã©ãã«ã§ã¡ã³ããã³ã¹æ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®äººæ°ã®ããWebã¢ããªã±ãŒã·ã§ã³ãã¬ãŒã ã¯ãŒã¯ã§ãããã€ãã£ãã®Node.js HTTPã¢ãžã¥ãŒã«äžã«æœè±¡åå±€ãæäŸããããšã§ãéçºããã»ã¹ãç°¡ç¥åããæå°éã®ã³ãŒãã§å ç¢ãªã¢ããªã±ãŒã·ã§ã³ãäœæã§ããããã«ããŸãã
2. ç·åœããæ»æã®ç¹å®
ã¢ããªã±ãŒã·ã§ã³ãç·åœããæ»æããä¿è·ããããã«ã¯ããŸãæ»æãé²è¡äžã§ããå åãç¹å®ããå¿ èŠããããŸãã以äžã¯ãäžè¬çãªææšã§ãã
2.1 倱æãããã°ã€ã³è©Šè¡ã®æ°ãéåžžãããå€ã
æ¥ã«å€±æãããã°ã€ã³è©Šè¡ãå¢ãããšãç·åœããæ»æãè¡ãããŠããããšã瀺ãããšããããŸãããã°ã€ã³è©Šè¡ãç£èŠããã¢ã©ãŒããèšå®ããããšã§ããã®ã¿ã€ãã®æŽ»åãç¹å®ã§ããŸãã
2.2 èŠæ±ã®äžå¯©ãªãã¿ãŒã³
ç·åœããæ»æè ã¯ãèªåã¹ã¯ãªããã䜿çšããŠãªã¯ãšã¹ããé«éã«éä¿¡ããããšããããããŸããæ¥æ¿ãªãã©ãã£ãã¯ã®å¢å ãåäžã®IPã¢ãã¬ã¹ããã®ãªã¯ãšã¹ããªã©ãéåžžãšã¯ç°ãªããªã¯ãšã¹ãã®ãã¿ãŒã³ã¯ãç·åœããæ»æã®å åã§ããããšããããŸãã
2.3 IPã¢ãã¬ã¹ã®è©å€
æ»æè ã¯ãæªæã®ããæŽ»åã§ç¥ãããŠããIPã¢ãã¬ã¹ã䜿çšããããšããããŸãããã®ãããªIPããã®ãã©ãã£ãã¯ãç£èŠãããããã¯ããããšã§ãã¢ããªã±ãŒã·ã§ã³ãç·åœããæ»æããä¿è·ããããšãã§ããŸãã
3. ã»ãã¥ãªãã£å¯Ÿçã®å®è£
Node.js Expressã¢ããªã±ãŒã·ã§ã³ãç·åœããæ»æããä¿è·ããããã«ã¯ãããŸããŸãªã»ãã¥ãªãã£å¯Ÿçãå®è£ ããå¿ èŠããããŸãã以äžã®ææ³ã«ã€ããŠèª¬æããŸãã
3.1 ã¬ãŒãå¶é
ã¬ãŒãå¶éã¯ãã¯ã©ã€ã¢ã³ããç¹å®ã®æéå ã«éä¿¡ã§ãããªã¯ãšã¹ãã®æ°ãå¶éããããšã§ãèªåã¹ã¯ãªããããªã¯ãšã¹ãã§ãµãŒããŒãå§åãããªãœãŒã¹ãæ¶è²»ããç·åœããæ»æãæåããã®ãé²ããŸãã
3.1.1 Express-rate-limitããã«ãŠã§ã¢
Express-rate-limitã¯ãExpressçšã®ã¬ãŒãå¶éãæå¹ã«ããããã«ãŠã§ã¢ã§ãã䜿çšããã«ã¯ãããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãã
npm install express-rate-limit
次ã«ãã¢ããªã±ãŒã·ã§ã³ã«èšå®ãšé©çšããŸãã
const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15å
max: 100, // åIPãwindowMsããšã«100ãªã¯ãšã¹ãã«å¶é
});
app.use(limiter);
windowMsãšmaxãªãã·ã§ã³ããã¢ããªã±ãŒã·ã§ã³ã®ããŒãºã«åãããŠèª¿æŽããŸãã
3.2 ãã£ããã£
ãã£ããã£ã¯ããŠãŒã¶ãŒã«ç»åå ã®ãªããžã§ã¯ããèå¥ããããç°¡åãªæ°åŠåé¡ãè§£ããããããã£ã¬ã³ãžã解決ãããããšã§ã人éãšããããåºå¥ããŸããããã«ãããæ»æè ãç·åœããæ»æã§èªåã¹ã¯ãªããã䜿çšããã®ãé£ãããªããŸãã
3.2.1 Google reCAPTCHAã®å®è£
Googleã®reCAPTCHAãµãŒãã¹ã¯ãäžè¬çãªãã£ããã£ãœãªã¥ãŒã·ã§ã³ã§ããNode.js Expressã¢ããªã±ãŒã·ã§ã³ã«å®è£ ããã«ã¯ã以äžã®æé ã«åŸã£ãŠãã ããã
- reCAPTCHAãŠã§ããµã€ãã§ã¢ããªã±ãŒã·ã§ã³ãç»é²ããAPIããŒãååŸããŸãã
- google-recaptchaããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãã
npm install google-recaptcha
- ã¯ã©ã€ã¢ã³ããµã€ãã®ã³ãŒãããã°ã€ã³ãã©ãŒã ã«è¿œå ããŸãã
<head>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
</head>
<body>
<form>
<!-- ãã©ãŒã ãã£ãŒã«ã -->
<div class="g-recaptcha" data-sitekey="YOUR_SITE_KEY"></div>
<button type="submit">éä¿¡</button>
</form>
</body>
- ãµãŒããŒãµã€ãã§reCAPTCHAã®å¿çãæ€èšŒããŸãã
const GoogleRecaptcha = require('google-recaptcha');
const recaptcha = new GoogleRecaptcha({secret: 'YOUR_SECRET_KEY'});
app.post('/login', (req, res) => {
const recaptchaResponse = req.body['g-recaptcha-response'];
recaptcha.verify({response: recaptchaResponse}, (error) => {
if (error) {
// ç¡å¹ãŸãã¯æéåãã®reCAPTCHAå¿ç
res.status(400).json({error: 'ç¡å¹ãªãã£ããã£'});
} else {
// ãã°ã€ã³ããžãã¯ãç¶ãã
}
});
});
3.3 ã¢ã«ãŠã³ãã®ããã¯ã¢ãŠã
ç¹å®ã®åæ°ã®ãã°ã€ã³è©Šè¡ã倱æããåŸã«ã¢ã«ãŠã³ããããã¯ã¢ãŠãããããšããç·åœããæ»æã«å¯Ÿãã广çãªå¯Ÿçã§ãããã ããã»ãã¥ãªãã£ãšå©äŸ¿æ§ã®ãã©ã³ã¹ãåãããšãéèŠã§ãããããã¯ã¢ãŠããéå°ã«ãªããšãæ£åœãªãŠãŒã¶ãŒãäžäŸ¿ãæããããšããããŸãã
3.3.1 ã¢ã«ãŠã³ãããã¯ã¢ãŠãã®å®è£
ã¢ã«ãŠã³ãããã¯ã¢ãŠããå®è£ ããã«ã¯ãåãŠãŒã¶ãŒã®ãã°ã€ã³è©Šè¡åæ°ã远跡ããå¿ èŠããããŸãããã®ç®çã§ãããŒã¿ããŒã¹ãRedisã®ãããªã€ã³ã¡ã¢ãªã¹ãã¢ã䜿çšããããšãæ€èšããŠãã ããã以äžã¯Redisã䜿çšããäŸã§ãã
- redisããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãã
npm install redis
- Redisãèšå®ãã倱æãããã°ã€ã³è©Šè¡ã远跡ããŸãã
const redis = require('redis');
const client = redis.createClient();
app.post('/login', (req, res) => {
const { username, password } = req.body;
// ã¢ã«ãŠã³ããããã¯ãããŠãããã©ããã確èªããŸãã
client.get(lockout: ${ username }, (err, lockout) => {
if (lockout) {
return res.status(429).json({ error: 'ã¢ã«ãŠã³ããããã¯ãããŠããŸã' });
}// è³æ Œæ
å ±ã確èªããŸãã
authenticate(username, password, (err, success) => {
if (success) {
// 倱æãããã°ã€ã³è©Šè¡ã«ãŠã³ã¿ããªã»ããããŸãã
client.del(`failed:${username}`);
// ãã°ã€ã³ããžãã¯ãç¶ããŸãã
} else {
// 倱æãããã°ã€ã³è©Šè¡ã«ãŠã³ã¿ãå¢ãããŸãã
client.incr(`failed:${username}`);
// å¶éã«éããŠãããã©ããã確èªããŸãã
client.get(`failed:${username}`, (err, attempts) => {
if (attempts >= 5) {
// 30åéã¢ã«ãŠã³ããããã¯ããŸãã
client.setex(`lockout:${username}`, 30 * 60, 1);
}
});
res.status(401).json({ error: 'ç¡å¹ãªè³æ Œæ
å ±' });
}
});
});
});
ããã¯ã¢ãŠãæéãšå€±æè©Šè¡åæ°ã®æå€§å€ãå¿ èŠã«å¿ããŠèª¿æŽããŸãã
ãŸãšã
Node.js Expressã¢ããªã±ãŒã·ã§ã³ãç·åœããæ»æããä¿è·ããããšã¯ãã·ã¹ãã ã®ã»ãã¥ãªãã£ãšå®å šæ§ã確ä¿ããããã«éèŠã§ããã¬ãŒãå¶éããã£ããã£ãã¢ã«ãŠã³ãããã¯ã¢ãŠããªã©ã®ã»ãã¥ãªãã£å¯Ÿçãå®è£ ããããšã§ãäžæ£ã¢ã¯ã»ã¹ã®ãªã¹ã¯ãå€§å¹ ã«æžããããšãã§ããŸããèŠæå¿ãæã¡ç¶ããææ°ã®ã»ãã¥ãªãã£ãã©ã¯ãã£ã¹ã«ã¢ããªã±ãŒã·ã§ã³ãã¢ããããŒãããŠããŠãŒã¶ãŒã«å®å šã§å®å¿ãªç°å¢ãæäŸããŸãããã
Mình hy vá»ng bạn thÃch bà i viết nà y và há»c thêm ÄÆ°á»£c Äiá»u gì Äó má»i.
Donate mình má»t ly cafe hoặc 1 cây bút bi Äá» mình có thêm Äá»ng lá»±c cho ra nhiá»u bà i viết hay và chất lượng hÆ¡n trong tương lai nhé. à mà nếu bạn có bất kỳ câu há»i nà o thì Äừng ngại comment hoặc liên há» mình qua: Zalo - 0374226770 hoặc Facebook. Mình xin cảm Æ¡n.
Momo: NGUYá»N ANH TUẀN - 0374226770
TPBank: NGUYá»N ANH TUẀN - 0374226770 (hoặc 01681423001)
All Rights Reserved
