검증되지 않은 서버측 URL 리다이렉트 (Open Redirect)
Unvalidated Redirects and Forwards (Open Redirect)
Last updated
Unvalidated Redirects and Forwards (Open Redirect)
Last updated
const express = require("express");
const app = express();
// 취약: 사용자 입력을 그대로 사용하여 리다이렉트
app.get("/go", (req, res) => {
const target = req.query.u; // 사용자 제어 입력
return res.redirect(target); // 검증 없음 (Open Redirect)
});
app.listen(3000);const express = require("express");
const app = express();
// 안전: 내부 경로 화이트리스트 + 외부 도메인 키 매핑
const allowedPaths = new Set(["/home", "/dashboard", "/help"]);
const externalMap = {
docs: "https://docs.example.com",
status: "https://status.example.com",
};
app.get("/go", (req, res) => {
const next = (req.query.next || "").trim(); // 내부 이동 후보
const siteKey = (req.query.site || "").trim(); // 외부 도메인 키
// 1) 내부 경로만 허용: 사전에 정의된 경로로 제한
if (allowedPaths.has(next)) {
return res.redirect(next);
}
// 2) 외부 리다이렉트는 키→URL 매핑으로만 허용
const extUrl = externalMap[siteKey];
if (extUrl) {
return res.redirect(extUrl);
}
// 3) 검증 실패 시 안전한 기본 경로로 이동
return res.redirect("/");
});
app.listen(3000);