// SQL injection attack의 예시
const express = require("express");
const app = express();
const mysql = require("mysql");
const connection = mysql.createConnection({
host: "localhost",
user: "root",
password: "password",
database: "test",
});
app.get("/user", (req, res) => {
const id = req.query.id;
const query = `SELECT * FROM users WHERE id = ${id}`;
connection.query(query, (error, results) => {
if (error) {
throw error;
}
res.send(results);
});
});
app.listen(3000, () => {
console.log("Example app listening on port 3000!");
});
app.get("/user", (req, res) => {
const id = req.query.id;
const query = "SELECT * FROM users WHERE id = ?";
connection.query(query, [id], (error, results) => {
if (error) {
throw error;
}
res.send(results);
});
});
app.listen(3000, () => {
console.log("Example app listening on port 3000!");
});
다른 사용자들이 보는 웹페이지에 악성 스크립트를 삽입하는 것.
이러한 공격으로 인해 민감한 데이터(login credentials 등)가 도난당할 수 있음.
// XSS attack의 예시
const express = require("express");
const app = express();
app.get("/", (req, res) => {
const name = req.query.name;
res.send(`<h1>Hello, ${name}</h1>`);
});
app.listen(3000, () => {
console.log("Example app listening on port 3000!");
});
<script>alert('XSS')</script>라는 값을 넘겼을 때 이는 악성 스크립트가 된다. const express = require("express");
const app = express();
const escapeHtml = require("escape-html");
app.get("/", (req, res) => {
const name = escapeHtml(req.query.name);
res.send(`<h1>Hello, ${name}</h1>`);
});
app.listen(3000, () => {
console.log("Example app listening on port 3000!");
});
서버에 과부하를 주어서 마비시키는 것.
이를 방지하기 위해서는 속도 제한을 구현하고, 적절한 오류 처리를 사용하고, 강력한 인프라를 구축해야 한다.
const express = require("express");
const app = express();
app.get("/", (req, res) => {
// Do a resource-intensive operation
while (true) {}
});
app.listen(3000, () => {
console.log("Example app listening on port 3000!");
});
const express = require("express");
const app = express();
const rateLimit = require("express-rate-limit");
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100, // limit each IP to 100 requests per windowMs
message: "Too many requests, please try again later",
});
app.use(limiter);
app.get("/", (req, res) => {
res.send("Hello, World!");
});
app.listen(3000, () => {
console.log("Example app listening on port 3000!");
});
부적절한 인증 및 권한 부여로 인해 민감한 데이터에 대한 무단 액세스가 발생하여 도난이나 손상이 발생할 수 있음
이를 방지하기 위해 적절한 인증 및 권한 부여 방법을 구현해야 함
const express = require("express");
const app = express();
app.get("/secret", (req, res) => {
res.send("This is a secret page!");
});
app.listen(3000, () => {
console.log("Example app listening on port 3000!");
});
const express = require("express");
const app = express();
const checkAuth = (req, res, next) => {
if (!req.session.user) {
return res.status(401).send("Unauthorized");
}
next();
};
app.get("/secret", checkAuth, (req, res) => {
res.send("This is a secret page!");
});
app.listen(3000, () => {
console.log("Example app listening on port 3000!");
});
const express = require("express");
const app = express();
const users = [
{ id: 1, name: "John Doe" },
{ id: 2, name: "Jane Doe" },
];
app.get("/user/:id", function (req, res) {
let user = users.find((user) => user.id == req.params.id);
if (!user) {
res.status(404).send("User not found");
return;
}
res.send(user);
});
app.listen(3000);
https://blog.javascripttoday.com/blog/node-js-server-vulnerabilities/