이메일로 사용자를 조회하는 코드를 떠올려볼게요. 사용자 입력이 쿼리에 들어가는 방식까지 확인했나요? 이번 샘플은 email을 SQL 문자열에 직접 넣는 코드입니다.
먼저, 입력값이 지나가는 길을 봐요
요청으로 받은 이메일이 문자열 보간을 거쳐 쿼리로 실행됩니다. 확인할 부분은 이메일의 생김새가 아니라, 이 값이 SQL 명령문과 섞이는 위치예요.
요청의 email→SQL 문자열에 포함→DB 쿼리 실행
아래는 실제 서비스에서 가져온 코드가 아닌, 문제와 수정 방향을 설명하기 위한 예시입니다.
예제 코드 · src/users/user.repository.ts
const sql = `SELECT id, email FROM users
WHERE email = '${email}'`;
return this.dataSource.query(sql);수정 예시
return this.dataSource.query( 'SELECT id, email FROM users WHERE email = ?', [email], );
명령은 그대로, 값은 따로 보내요
수정 예시에서는 쿼리에 ?를 두고 이메일은 별도의 배열로 전달합니다. MariaDB와 TypeORM을 가정한 코드이므로, 프로젝트의 드라이버와 기존 반환 형식을 먼저 확인해야 해요.
수정안을 적용하기 전에
정상 이메일로 조회했을 때 이전과 같은 결과가 나오는지, 입력값이 SQL 문법이 아닌 값으로 전달되는지 확인하세요. 화면의 수정 제안은 자동으로 적용되지 않습니다.
발견 근거와 실행 검증은 달라요
TEUM 샘플은 코드 위치와 규칙을 보여줍니다. 이 화면에서 실제 데이터베이스에 요청하거나 공격을 재현한 것은 아니에요.
교육용 예제 코드와 점검 흐름을 설명하는 글입니다. 입력한 대상의 실제 보안 점검 결과가 아닙니다.
이제 결과 화면에서 확인해보세요
샘플 항목 검토하기 →로그인이나 자료 전송 없이 고정 샘플을 볼 수 있어요.