제일 중요한 규칙 하나
유저 입력으로 SQL 문자열을 이어붙이거나 f-string으로 만드는 짓은 절대 하지 마. Placeholder를 쓰고 값은 따로 넘겨. escaping은 드라이버가 알아서 하고, SQL injection은 구조적으로 불가능해져.
SQLite가 받는 placeholder 스타일은 둘이야.
- Qmark —
?에 tuple이나 list를 짝지어. 순서대로 들어가. - Named —
:name에 dict를 짝지어. 코드만 봐도 뭐가 뭔지 읽혀.
Warning:
conn.execute(f'SELECT * FROM users WHERE name = "{name}"')는 그 자체로 보안 버그야. 똑같은 패턴이 production에서 수도 없이 데이터 유출의 뿌리가 됐어. 언제나 placeholder를 써. '믿을 만한' 입력이라도. 믿을 만하다는 건 손에서 잘 미끄러지는 성질이거든.placeholder가 못 하는 게 하나 있어. 테이블 이름이나 컬럼 이름 같은 식별자는 parameter로 못 넘겨. 그건 허용 목록으로 검사한 다음에만 SQL 문자열에 끼워 넣어.