← 질문 목록
#256깊이 0
SQL 인젝션은 무엇으로 막는가?
답변 연습
내 답변 적어보기접힘
이 브라우저에 자동 저장 · 0자
모범답안 확인하기내 답변 뒤에 열어보세요
기본은 prepared statement의 값 바인딩이다. SQL 문법을 먼저 고정하고 입력은 별도 값으로 전달한다. 입력에 따옴표나 연산자가 있어도 문법으로 해석되지 않는다.
| 입력 위치 | 처리 방법 | 이유 |
|---|---|---|
| 이름·나이 같은 값 | placeholder에 바인딩 | 끝까지 값으로 다룬다 |
| 열·표 이름 | 코드의 허용 목록에서 매핑 | 보통 값으로 바인딩할 수 없다 |
| 정렬 방향 | 정해 둔 enum에서 선택 | 임의 문법 조각을 받지 않는다 |
이스케이프나 금지 문자 목록을 주 방어로 삼지 않는다. 데이터베이스·문자 인코딩·문맥마다 규칙이 달라 빠뜨리기 쉽다. 입력 검증은 업무 형식을 지키는 보조 수단이지 값 바인딩의 대체가 아니다.
ORM을 쓴다고 자동으로 안전해지지는 않는다. ORM의 파라미터 API는 안전하지만 raw query에 문자열을 합치면 같은 취약점이 생긴다. 저장 프로시저도 내부에서 동적 SQL을 이어 붙이면 위험하다.
저장할 때 문제가 없던 문자열도 나중에 다른 질의에 이어 붙이면 공격이 된다. 데이터베이스에서 읽은 값도 다시 SQL에 넣을 때는 바인딩한다.
최소 권한은 피해를 줄이는 두 번째 방어선이다. 앱 계정에서 스키마 변경 권한을 빼고 읽기·쓰기가 다르면 계정을 나눈다. 권한을 줄였다고 인젝션 자체가 막히는 것은 아니다.