flawopen.com/JavaScript SQL Injection/TypeORM
TypeORM QueryBuilder는 SQL Injection에 안전한가요?
참고 가이드
간단한 답변
바인딩 매개변수는 양식의 이름 있는 값 칸과 같습니다. TypeORM이 값을 별도로 보내므로 SQL 명령이 아닌 데이터로 남습니다. QueryBuilder는 별도로 전달된 이름 매개변수를 바인딩합니다. 조건에 입력을 보간하면 다시 SQL 텍스트가 됩니다.
취약 — 입력을 SQL에 보간
userRepo.createQueryBuilder("u")
.where(`u.id = ${userId}`)
.getOne()
강화 — 값을 별도로 바인딩
userRepo.createQueryBuilder("u")
.where("u.id = :id", { id: userId })
.getOne()
값은 바인딩하고 쿼리 구조는 제한
QueryBuilder.where()는 :id 같은 이름 placeholder가 포함된 조건과 별도의 매개변수 객체를 받습니다. 값이 다르면 매개변수 이름도 다르게 쓰세요. 이름을 재사용하면 값이 덮어써질 수 있다고 TypeORM은 경고합니다. 사용자 입력을 조건에 보간하지 마세요. dataSource.query() 같은 raw 메서드도 드라이버별 placeholder와 별도 전달 값을 지원합니다. 매개변수는 데이터를 바인딩하며 테이블명, 컬럼명, 정렬 방향, 임의 SQL을 대신하지 않습니다. 선택 가능한 구조는 애플리케이션의 고정 표현식으로 매핑하세요.
TypeORM 쿼리 구성 감사 방법
rg -n '(\.where\(|\.query\(|\.sql)' --glob '*.ts' .자주 묻는 질문
TypeORM Repository find 메서드는 항상 안전한가요?
일반 find 옵션은 TypeORM 쿼리 구성에 값을 전달하지만 사용자 지정 연산자, raw SQL 표현식, 애플리케이션에서 조립한 문자열을 검토하세요. 매개변수화는 구문 주입을 막지만 레코드 접근을 인가하거나 값의 업무 의미를 검증하지는 않습니다.