FlawOpen

flawopen.com/JavaScript SQL Injection/Sequelize

Sequelize query()는 SQL Injection에 안전한가요?

참고 가이드
간단한 답변

쿼리 매개변수는 봉인된 값 카드와 같습니다. SQL은 값을 쿼리 명령과 분리해 받습니다. Sequelize v6에서 bind는 값을 따로 보내고 replacements는 전송 전에 이스케이프해 삽입합니다. 신뢰할 수 없는 입력으로 문자열을 만들면 두 방법을 모두 우회합니다. 둘 다 테이블명이나 컬럼명을 대신하지 않습니다.

취약 — 입력을 SQL에 연결
sequelize.query(
  `SELECT * FROM users WHERE id = ${userId}`
)
강화 — 값을 별도로 바인딩
sequelize.query(
  "SELECT id FROM users WHERE id = $id",
  { bind: { id: userId },
    type: QueryTypes.SELECT }
)

값을 SQL 구문과 분리

Sequelize v6에서 replacements는 Sequelize가 데이터베이스 전송 전에 이스케이프해 삽입하고, bind는 SQL 텍스트와 값을 따로 전달합니다. 둘 다 사용자 값을 연결하지 않지만 문법은 메서드와 dialect에 따라 다릅니다. 매개변수는 테이블명, 컬럼명, 정렬 방향, 임의 SQL 조각을 대신하지 않습니다. 선택 가능한 구조는 애플리케이션의 고정 allowlist로 매핑하세요. 모델 메서드는 일반 구조화 값을 처리하지만 raw SQL과 literal 표현식도 검토해야 합니다.

Sequelize 쿼리 구성 감사 방법

rg -n 'sequelize\.query\(|Sequelize\.literal\(' --glob '*.{js,ts,mjs,cjs}' .

자주 묻는 질문

Sequelize 모델 메서드는 항상 SQL Injection에 안전한가요?

일반 구조화 값은 Sequelize 쿼리 구성이 처리합니다. 그래도 raw SQL, literal 표현식, 애플리케이션이 조립한 문자열을 검토하세요. 매개변수화는 레코드 접근을 인가하거나 업무 규칙을 검증하지 않습니다.

참고 자료

함께 보기 SQL 인젝션(CWE-89): 동작 원리와 언어별 방어 방법 — flawopen.com SQLAlchemy text()는 SQL Injection에 안전한가요? sqlx의 컴파일 시 쿼리 검사가 SQL 인젝션을 막나요? 저장 프로시저는 SQL 인젝션을 막나요? TypeORM QueryBuilder는 SQL Injection에 안전한가요? Django ORM SQL Injection: 안전한 패턴 Doctrine ORM SQL 인젝션: 안전한 쿼리