설명
사용자 입력으로 선택한 객체 프로퍼티를 함수로 호출하면 존재하지 않는 메서드나 프로토타입 메서드가 호출되어 런타임 예외가 발생할 수 있습니다. 요청 처리 중 예외가 잡히지 않으면 서비스 거부로 이어질 수 있으며, 의도하지 않은 메서드가 실행될 위험도 있습니다.
잠재적 영향
- 존재하지 않는 함수 호출로 요청 처리기가 예외를 던지고 서비스 가용성이 저하될 수 있습니다.
- 공격자가 허용되지 않은 액션 이름을 전달해 내부 메서드 호출을 유도할 수 있습니다.
- 프로토타입 체인에 있는 속성이 호출 대상이 되면 의도하지 않은 동작이 발생할 수 있습니다.
해결 방법
- 사용자 입력으로 메서드를 직접 선택하지 말고 명시적인
switch또는 허용 목록을 사용하세요. - 동적 조회가 필요하면
Object.hasOwn또는hasOwnProperty로 own property인지 확인하고typeof value === "function"인지 검증하세요. - 허용되지 않은 action은 기본 거부 응답으로 처리하세요.
예시
변경 전
javascript
const actions = {
play(data) {
return data;
},
};
app.get("/perform/:action", (req, res) => {
res.send(actions[req.params.action](req.query.payload));
});
변경 후
javascript
const actions = Object.freeze({
play(data) {
return data;
},
});
app.get("/perform/:action", (req, res) => {
const action = actions[req.params.action];
if (!Object.hasOwn(actions, req.params.action) || typeof action !== "function") {
return res.status(400).send("Unsupported action");
}
return res.send(action(req.query.payload));
});
설명:
- 변경 전: 사용자 입력을 그대로 객체 키로 사용해 함수를 호출하므로 잘못된 키가 들어오면 예외가 발생하거나 의도하지 않은 속성을 호출할 수 있습니다.
- 변경 후: 허용된 own property인지 확인하고 함수 타입인지 검증한 뒤에만 호출합니다.