파라미터화된 쿼리는 값을 쿼리에 특수 매개변수를 통해 전달할 수 있도록 하여 변수의 직접 치환을 피하게 합니다. 이는 보안을 높이고 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;"). 또한 이는 다양한 데이터 유형의 모든 특징을 포함하지 않으며, 인코딩이나 특수 기호를 통한 필터 우회를 방지하지 못합니다. 항상 파라미터화된 쿼리를 사용해야 합니다.
이야기
이야기
이야기
CRM에서 "O'Connor"라는 문자가 SQL 쿼리를 단순 문자열 추가로 생성하는 어플리케이션에서 오류를 일으켰습니다. 이스케이프되지 않은 단일 따옴표로 인해 그러한 성을 가진 카드는 저장되지 않았으며, 이는 1년 후에야 발견되었습니다.