가장 중요한 single rule
유저 input 으로 string concat / f-string 으로 SQL 절대 빌드 X. Placeholder 쓰고 parameter 따로. 드라이버가 escaping 처리; SQL injection 이 구조적으로 불가능.
SQLite 가 placeholder 스타일 2 가지:
- Qmark:
?+ tuple/list. 순서 기반. - Named:
:name+ dict. Self-documenting.
Warning:
conn.execute(f'SELECT * FROM users WHERE name = "{name}"') 는 보안 버그. 같은 패턴이 production 에서 무수한 데이터 유출 root cause. Placeholder 항상 — 'trusted' input 도. Trusted 는 미끄러운 속성.Placeholder 가 못 하는 거 = identifier (테이블명, 컬럼명) parameterize. 그건 allowlist 검증 후에만 SQL string 에 format.