프로그래밍풀스택 개발자

파라미터화된 쿼리와 동적 SQL에 대해 설명해 주세요. 각 접근법을 언제 사용하는 것이 좋으며, 동적 SQL과 관련된 위험은 무엇이며 이를 피하는 방법은 무엇인가요? 예를 들어 주세요.

Hintsage AI 어시스턴트로 면접 통과

답변.

파라미터화된 쿼리는 값을 쿼리에 특수 매개변수를 통해 전달할 수 있도록 하여 변수의 직접 치환을 피하게 합니다. 이는 보안을 높이고 SQL 인젝션으로부터 보호하며, 반복적인 쿼리의 실행 속도를 계획 캐싱을 통해 빠르게 합니다.

동적 SQL은 쿼리를 실시간으로 생성하고 실행할 수 있도록 합니다 (예: MS SQL의 EXEC sp_executesql 또는 PostgreSQL의 PREPARE/EXECUTE를 통해). 주의가 필요합니다: 값이 쿼리 텍스트에 직접 삽입되면 SQL 인젝션, 구문 오류 및 성능 저하를 초래할 수 있습니다.

파라미터화된 쿼리 예제 (Python의 psycopg2 라이브러리 사용):

cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))

PostgreSQL에서의 동적 SQL 예제:

EXECUTE format('SELECT * FROM %I WHERE value = %L', tablename, value);

함정 질문.

질문: 일부 오래된 어플리케이션이 하는 것처럼 단순히 따옴표(')를 이스케이프하는 것이 SQL 인젝션으로부터 보호하기에 충분하지 않은 이유는 무엇인가요?

답변:

따옴표를 이스케이프하는 것만으로는 모든 종류의 인젝션으로부터 보호할 수 없으며, 특히 공격자가 SQL 쿼리 구조를 삽입할 경우 (예: "; DROP TABLE users;"). 또한 이는 다양한 데이터 유형의 모든 특징을 포함하지 않으며, 인코딩이나 특수 기호를 통한 필터 우회를 방지하지 못합니다. 항상 파라미터화된 쿼리를 사용해야 합니다.


이야기

급여 계산 시스템 중 하나에서 동적 SQL이 보고서를 생성했습니다. 오래된 프레임워크의 파라미터화를 지원하지 않아 문자열을 수동으로 연결했습니다. 한 사용자가 "성" 필드에 SQL 조각을 실수로(또는 일부러) 입력하여 타인의 급여에 접근할 수 있었습니다.

이야기

소규모 인터넷 쇼핑몰이 적절한 검증 없이 상품 필터링에 동적 SQL을 사용했습니다. 비표준 값을 입력하려 할 때 사용자가 SQL 파서 오류를 유발하여 모든 상품 목록이 "중단"되었습니다.

이야기

CRM에서 "O'Connor"라는 문자가 SQL 쿼리를 단순 문자열 추가로 생성하는 어플리케이션에서 오류를 일으켰습니다. 이스케이프되지 않은 단일 따옴표로 인해 그러한 성을 가진 카드는 저장되지 않았으며, 이는 1년 후에야 발견되었습니다.