C 언어, 파싱(Parsing)으로 안전한 코딩을!
'Parse, Don't Validate' 기법은 데이터 유효성 검사 대신 파싱을 통해 시스템의 안전성을 높이는 접근 방식임.
C 언어에서 커스텀 타입(Custom Type)을 생성하여 `char *` 대신 사용함으로써 타입 안전성을 확보하고, 컴파일 타임(Compile Time)에 오류를 감지함.
입력 데이터(Input Data)를 시스템 경계에서 파싱하고, 내부 함수에서는 파싱된 타입만을 사용함으로써 공격 표면(Attack Surface)을 줄임.
파라미터 순서 오류(Parameter Order Error)와 같은 잠재적 버그를 컴파일 시점에 감지하여 런타임 오류를 예방함.
C 언어의 타입 안전성 확보
본 게시물은 C 언어에서 타입 안전성(Type Safety)을 확보하기 위해 `char *` 대신 커스텀 타입을 사용하는 방법을 제시한다. Opaque Type을 활용하여 이메일, 이름 등 특정 목적에 맞는 타입을 정의하고, 컴파일러가 타입 불일치를 감지하도록 함으로써, 잘못된 파라미터 전달(Incorrect Parameter Passing)로 인한 오류를 방지한다. 이는 런타임 오류를 컴파일 타임에 발견하도록 하여 시스템의 안정성을 높이는 핵심 전략이다.
시스템 경계에서의 데이터 파싱
게시물은 시스템의 입력 경계(Input Boundary)에서만 `char *`를 사용하고, 파싱된 데이터를 내부 함수에 전달하는 방식을 강조한다. 데이터 격리 아키텍처(Data Isolation Architecture)를 통해 시스템 내부에서는 안전한 타입의 데이터만 사용되도록 보장한다. 이러한 접근 방식은 공격 표면(Attack Surface)을 줄이고, 악의적인 입력으로 인한 잠재적 취약점을 최소화하는 데 기여한다. 특히, C 언어의 포인터(Pointer) 사용 시 발생할 수 있는 문제점을 해결하는 데 효과적이다.
파싱 실패 시의 안전한 처리
게시물은 파싱 실패 시의 안전한 오류 처리 메커니즘을 제시한다. 파싱 함수가 실패할 경우, `NULL`을 반환하고, 호출자는 이를 확인하여 적절한 오류 처리를 수행해야 한다. 또한, Destructor Function을 활용하여 메모리 누수(Memory Leak)를 방지하고, 이중 해제(Double Free)와 같은 문제를 해결한다. 이러한 안전 장치는 시스템의 Robustness를 향상시키고, 잠재적인 보안 취약점을 예방하는 데 기여한다.
코드 예제를 통한 이해
게시물은 실제 컴파일 가능한 C 코드 예제를 통해 'Parse, Don't Validate' 기법을 설명한다. Opaque Type 정의, 파싱 함수 구현, 그리고 파라미터 순서 오류를 컴파일 타임에 감지하는 방법을 보여준다. 특히, `store_record_old` 함수와 `store_record_new` 함수의 비교를 통해, 타입 안전성의 중요성을 강조한다. 이 예제는 C 언어 개발자들이 안전한 코드를 작성하는 데 실질적인 도움을 제공한다.