보안을 설계 단계에서 고려하지 않아 발생하는 근본적인 로직 결함입니다. 코드 수정만으로는 해결되지 않고 재설계가 필요합니다.
// ❌ 취약: 금액 검증 없음
const amt = parseFloat(amount); // 음수 가능
run('UPDATE users SET balance_krw = balance_krw - ? WHERE id=?',
[amt, user.id]); // -(-1000000) = +1000000
// ❌ 취약: Mass Assignment
const role = req.body.role || user.role; // 클라이언트 입력 신뢰
run('UPDATE users SET role=? WHERE id=?', [role, user.id]);
// ✅ 안전: 양수 검증 + 잔액 확인
if (amt <= 0) return res.status(400).json({ error: '금액은 0보다 커야 합니다' });
if (user.balance_krw < amt) return res.status(400).json({ error: '잔액 부족' });
// ✅ 안전: 허용 필드만 업데이트
const { email, username } = req.body; // role 제외
run('UPDATE users SET email=?, username=? WHERE id=?',
[email, username, user.id]);