Skip to content
SERVERCATBLOG

quote는 중요하다

날짜

1분 읽기·조회 3·

문제/맥락

문자열을 감싸는 따옴표 한 쌍은 단순한 문법 요소가 아니다. 실무에서 따옴표 처리 실패는 로그 역주입, SQL/셸 인젝션, JSON/YAML 파싱 오류로 이어진다.

예를 들어 셸에서 변수를 따옴표로 감싸지 않으면 공백이나 특수문자 때문에 명령이 분해되고, DB에 문자열을 직접 연결하면 작은따옴표 하나로 쿼리가 깨진다. 언어마다 기본 규칙과 제공하는 안전한 도구가 있으니 무심코 넘어가면 문제를 만들기 쉽다.

핵심 포인트

SQL에는 파라미터화된 쿼리만 사용한다

사용자 입력을 문자열 연결로 쿼리에 넣지 않는다. 직접 작은따옴표를 붙이는 순간 인젝션에 문이 열린다.

1// 위험: 입력에 작은따옴표가 있으면 쿼리가 깨진다
2db.query(`SELECT * FROM users WHERE name = '${name}'`)
3
4// 안전: 값을 바인딩한다
5db.query('SELECT * FROM users WHERE name = $1', [name])

셸에서는 변수를 감싼다

변수는 ""로 감싸고, 복잡한 값은 printf %q(또는 shlex.quote)로 이스케이프한다. 감싸지 않은 변수는 단어 분리와 글로빙의 대상이 된다.

형식에 맞는 인코더를 쓴다

JSON이나 HTML에 삽입할 때는 해당 형식의 인코더·이스케이프 함수를 사용해 특수문자를 변환한다. 템플릿 문자열은 편리하지만 내부 표현식이 있으면 이스케이프와 검증을 병행한다.

로그에는 원본을 그대로 두지 않는다

민감정보는 마스킹하고 포맷을 통일한다. 로그 한 줄이 공격자의 입력 창구가 되지 않게 한다.

정리

따옴표는 단순 문법을 넘어 입력의 경계와 신뢰성을 지킨다. 언어별 권장 방식과 제공 함수만 일관되게 쓰면 대부분의 오류와 보안 문제를 예방할 수 있다.

댓글

관련 포스트

모두보기
이미지 없음
Finance

테스트는 명세다!

테스트를 실행 가능한 명세로 쓰는 방법. 요구사항을 코드로 고정해 팀의 오해를 줄이는 실천을 정리한다.

최근 작성글

모두보기
이미지 없음

테스트를 먼저 쓰는 이유

테스트를 먼저 쓰면 의도가 먼저 정리된다. 구현 전에 무엇을 만들지 정하는 습관을 정리한다.