피드로 돌아가기
Don't parse SQL to make a query runner read-only
Dev.toDev.to
Database

SQL 파싱 제거 및 DB Transaction Level 제어로 Read-Only 무결성 확보

Don't parse SQL to make a query runner read-only

ひとし 田畑2026년 6월 16일4intermediate

Context

사용자 입력 SQL의 쓰기 작업을 차단하기 위해 Application Layer에서 정규식이나 키워드 기반의 파싱을 시도하는 기존 방식의 한계 분석. CTE, 주석, side-effect function 등 다양한 우회 경로로 인해 정적 분석만으로는 완벽한 Read-Only 상태를 보장할 수 없는 보안 허점 식별.

Technical Solution

  • SQL 문자열 분석을 완전히 배제하고 Postgres 엔진의 SET TRANSACTION READ ONLY 명령을 통한 실행 권한 제어
  • 트랜잭션 시작 직후 첫 번째 문장으로 Read-Only 설정을 배치하여 데이터 변경 시도 시 DB 엔진 수준에서 즉각적인 에러 반환 유도
  • statement_timeout 설정을 통해 Cartesian Join 등 리소스 남용으로 인한 Backend 프로세스 점유 문제 방지
  • fetchmany를 통한 최대 행 수 제한으로 메모리 과부하 방지 및 네트워크 대역폭 최적화
  • 트랜잭션 종료 시 rollback()을 강제 호출하여 스냅샷 및 락(Lock)을 즉시 해제하고 리소스 누수 차단

1. SQL 키워드 필터링 대신 DB 내장 Transaction 모드 활용 검토

2. `SET TRANSACTION READ ONLY` 적용 시 반드시 트랜잭션의 첫 번째 문장으로 배치

3. Read-Only 모드와 별개로 `statement_timeout` 및 Row Limit 설정을 통한 리소스 보호 체계 구축

4. Auto-commit 설정 여부가 Read-Only 트랜잭션 동작에 미치는 영향 확인

원문 읽기