FlawOpen

flawopen.com/SQL Injection/매개변수화 쿼리란?

쉽게 말해 매개변수화 쿼리란?

참조 페이지
쉽게 설명하면

라벨이 붙은 빈칸이 있는 양식을 떠올려 보세요. 프로그램은 지시문을 고정해 두고 데이터베이스 라이브러리에 각 값을 해당 칸에 넣도록 요청합니다. 라이브러리는 서버 측 네이티브 준비를 사용하거나 클라이언트에서 이를 에뮬레이션할 수 있지만, 애플리케이션 코드가 사용자 입력으로 지시문을 다시 작성해서는 안 됩니다.

작동 원리

서버 측 네이티브 prepared statement에서는 드라이버가 플레이스홀더가 있는 SQL을 준비하고 실행 시 바인딩된 값을 제공합니다. 프로토콜과 시점은 데이터베이스와 드라이버에 따라 다릅니다. 일부 드라이버는 준비 과정을 클라이언트에서 에뮬레이션할 수 있으며 PDO는 이 모드를 명시적으로 문서화합니다. 따라서 API 호출만으로 값의 전송 방식을 알 수 없습니다. SQL 구조를 고정하고 드라이버가 문서화한 바인딩 API를 사용하며 네이티브와 에뮬레이션 중 어느 모드인지 확인하세요.

이것이 단지 "조심스럽게 이스케이프하기"와 다른 이유

수동 이스케이프는 연결 전에 애플리케이션 코드가 값을 올바르게 인코딩해야 하므로 취약하고 문맥에 따라 달라집니다. 매개변수 바인딩 API는 값 처리를 드라이버에 맡깁니다. 서버 측 네이티브 준비에서는 값이 별도의 프로토콜 매개변수로 전송되고, 에뮬레이션에서는 드라이버가 클라이언트에서 플레이스홀더를 처리합니다. 애플리케이션이 직접 만드는 SQL 문자열에 사용자 입력을 넣지 말고 드라이버가 문서화한 바인딩 동작을 확인하세요.

FAQ

이것은 "prepared statement"와 같은 것인가요?

밀접하게 관련됩니다. prepared statement는 고정된 쿼리 구조로부터 데이터베이스 측에 만들어지는 객체이고, 매개변수화는 거기에 값을 따로 바인딩하는 방식입니다. 두 용어는 흔히 혼용됩니다.

이것이 쿼리의 모든 부분에 적용되나요?

값(데이터)에만 해당하며, 테이블이나 열 이름 같은 식별자에는 해당하지 않습니다. 그런 것들에는 다른 방어, 보통 허용 목록이 필요합니다.

참고 자료

함께 보기 SQL 인젝션(CWE-89): 동작 원리와 언어별 방어 방법 — flawopen.com Prisma $queryRaw는 SQL Injection에 안전한가요? Rails where() 문자열 보간은 안전할까요? Sequelize query()는 SQL Injection에 안전한가요? SQLAlchemy text()는 SQL Injection에 안전한가요? sqlx의 컴파일 시 쿼리 검사가 SQL 인젝션을 막나요? 저장 프로시저는 SQL 인젝션을 막나요?