앱은 superuser로 연결하지 마
앱 전용 역할을 만들고 필요한 스키마와 테이블의 SELECT·INSERT·UPDATE·DELETE만 줘. ALTER DEFAULT PRIVILEGES로 나중에 생길 테이블의 권한도 정해.
RLS로 행의 경계를 데이터베이스에
행 수준 보안 정책은 현재 사용자나 고객에 따라 모든 질의가 볼 수 있는 행을 제한해. 앱이 WHERE를 빠뜨려도 데이터베이스가 마지막 경계를 지켜.
SQL 주입은 매개변수로 끝내
값은 항상 드라이버 매개변수로 보내. 열 이름처럼 매개변수화할 수 없는 식별자는 허용 목록으로 검사하고 quote_ident 계열 도구를 써.
권한 문장을 구체적으로 써
기본 postgres 사용자가 아니라 app 역할에 SELECT, INSERT, UPDATE, DELETE만 줘. GRANT USAGE ON SCHEMA, GRANT SELECT, INSERT ON TABLE, ALTER DEFAULT PRIVILEGES로 현재와 미래 객체의 권한을 정해. 동적 식별자가 꼭 필요하면 허용 목록 뒤 quote_ident를 써.