간편결제, 신용카드 청구할인
인터파크 롯데카드 5% (34,200원)
(최대할인 10만원 / 전월실적 40만원)
북피니언 롯데카드 30% (25,200원)
(최대할인 3만원 / 3만원 이상 결제)
NH쇼핑&인터파크카드 20% (28,800원)
(최대할인 4만원 / 2만원 이상 결제)
Close

CERT C 프로그래밍

원제 : THE CERT C SECURE CODING STANDARD
소득공제

2013년 9월 9일 이후 누적수치입니다.

판매지수 65
?
판매지수란?
사이트의 판매량에 기반하여 판매량 추이를 반영한 인터파크 도서에서의 독립적인 판매 지수입니다. 현재 가장 잘 팔리는 상품에 가중치를 두었기 때문에 실제 누적 판매량과는 다소 차이가 있을 수 있습니다. 판매량 외에도 다양한 가중치로 구성되어 최근의 이슈도서 확인시 유용할 수 있습니다. 해당 지수는 매일 갱신됩니다.
Close
공유하기
정가

40,000원

  • 36,000 (10%할인)

    2,000P (5%적립)

할인혜택
적립혜택
  • I-Point 적립은 출고완료 후 14일 이내 마이페이지에서 적립받기한 경우만 적립됩니다.
  • 추가혜택
    배송정보
    주문수량
    감소 증가
    • 이벤트/기획전

    • 연관도서(83)

    • 사은품(1)

    출판사 서평

    보안상 해커의 침입으로부터 안전하고, 버그 없이 신뢰도가 높은 소프트웨어를 개발할 수 있도록 컴퓨터 침해사고대응센터인 CERT가 제안하는 표준 C 프로그래밍 가이드. C언어로 개발되는 소프트웨어 취약성을 분석해 근본 원인이 되는 코딩 에러를, 심각도, 침해 발생가능성, 사후관리 비용 등에 따라 분류하고, 각 가이드라인에 해당하는 불안전한 코드의 예와 해결 방법을 함께 제시한다.

    이 책의 대상 독자

    이 책은 C 언어 프로그램 개발자를 주요 대상으로 삼았다. 인터넷 관련 시스템에서 보안은 매우 중요하며, 보안 소프트웨어 시스템이나 관련 시스템의 일부로 포함되는 소프트웨어 컴포넌트 역시 보안성이 강조된다. 시스템이 점점 더 많은 소프트웨어 컴포넌트로 구성되거나 다른 시스템과 연관될수록 어떤 소프트웨어가 다른 부분에서 사용되지 않는지, 어떤 부분에서 보안 요구사항을 더 강력히 만족해야 하는지 식별하기가 어려워진다.
    보안에 관심이 없는 C 언어 프로그래머라고 하더라도 이 책의 각 가이드라인에는 안전성, 신뢰성, 의존성, 견고성, 가용성, 유지보수성 등의 품질 지수를 높이는 데 필요한 실제적인 응용이 포함돼 있기 때문에 아주 유용하게 활용할 수 있다.

    이 책이 C++ 프로그래머를 대상으로 삼지는 않았고 많은 경우에 다른 해결 방법이 있기는 하지만, C 언어 프로그램에서 알려진 이슈의 상당수가 C++ 프로그램에서도 언급되는 부분이기 때문에 읽어볼 만하다.

    이 책의 구성

    전반적인 내용을 정리해 소개하는 1개 장과 각 특정 주제에 해당하는 가이드라인들을 설명한 13개 장, 그리고 특별한 환경에서 이 안전한 코딩 표준을 어떻게 적용할 수 있을지를 설명하는 POSIX 가이드라인 부록으로 구성했다. POSIX 부록은 강제하는 사항은 아니며, 표준을 설명하는 부분에 해당한다.
    대부분 가이드라인은 일정한 구조로 구성했다. 이 표준에 있는 각 가이드라인은 제목에 고유의 식별자가 있다. 가이드라인의 제목과 소개 절에서 규칙인지 제안인지를 정의하고 있다. 그리고 한 가지 이상의 '부적절한 코드 예'와 '해결 방법' 쌍이 있으며, '위험 평가'와 적절한 '참조' 리스트가 있다. '관련 취약성' 표도 넣어두었다.

    베타리더 한마디

    C를 처음 배웠을 때부터 지금까지 생산했던, 혹은 누가 작성했는지 모르지만 유지 보수해야 했던 C 프로그램들을 추억하며 이 책을 읽었습니다. 아무래도 표준에 관한 책이어서, 술술 단번에 읽히진 않았습니다. 그래도, 코드를 애초에 잘 작성했다면 밤에 꿈에서까지 디버깅을 하지 않아도 됐을 텐데 하고 탄식했던 나날이 많았던지라, 책에서 나열한 문제 상황과 지침에 대해 공감하며 읽을 수 있었습니다.
    현대 개발자 사회에서는 '안전함'보다는 '눈에 보이는 결과'나 '신속히' 보여주는 쪽을 중시하는 경향이 많습니다. 하지만 프로그래머의 행복을 위해서라도 안전한 코딩 습관은 스스로 익혀 두는 것이 좋지 않을까요? 한 번 읽고 치워두기보다는, 짬짬이 에세이 읽듯 예제를 즐기며, 자기 코드 반성의 시간을 가져보게 할 만한 책입니다.
    - 박소영 / (주)NHN 검색엔진팀

    안전하지 못하게 작성된 코드는 악의적인 해커들의 공격 대상이고 정상적인 시스템 동작이 방해되며, 심지어 시스템에 침투하여 파괴당할 수도 있다. DDoS, 바이러스, 해킹 등은 사회적으로도 큰 문제이며, 이는 보안을 고려하지 않거나 잘못 작성한 코드가 원인이 된다. 내가 만든 소프트웨어가 보안에 취약해 문제가 발생한다면, 시스템 자체 오동작으로 인해 비용 문제로까지 이어질 수 있다.
    이렇듯이 소프트웨어 보안에 대한 이슈는 항상 중요시되고 있으며, 최근에는 하드웨어적으로도 안전한 시스템 동작을 위해 CPU에서도 특정 메모리 영역에 접근을 금지하는 메모리 보호 기능도 지원하고 있다. 초보 개발자를 벗어나 좀 더 안전한 프로그래밍 코드를 작성할 수 있는 중고급 개발자로 업그레이드 하고 싶다면 이 책을 한번 읽어보기를 추천한다~!
    - 전희재 / (주)NHN 통합검색플랫폼팀

    C 언어 입문자를 위한 책은 많지만, 정작 C에 익숙해진 후 중고급 개발자가 되기 위해 참조할 수 있는 책은 많지 않은 것이 현실이다. 때문에 C로 상당 기간 개발해온 경력자들조차도 털어 보면 결함이 우수수 떨어지는 코드를 작성하곤 한다.
    책 내용의 상당수가 철없던 시절 아무도 알려 주는 사람이 없어 몸으로 부딪히며 깨달았던 사실이라 책을 읽으며 가슴에 사무치는 추억을 되살리기도 했다.
    한 달에 한 번 발생하는 에러를 잡기 위해 밤새 디버거를 부여잡고 있거나, 찜찜한 기분을 근거로 결함을 찾기 위해 코드와 싸우는 일도 나중에 생각해 보면 즐거운 추억(?)이 되겠지만, 이 책에서 제시하는 기준들을 익히고 실천한다면 그 중 상당수는 미리 비켜갈 수 있을 것이라고 생각한다. 힘써 정독한다면 투자한 이상으로 되돌려 받을 수 있을 것이다.
    - 전영훈/ (주)NHN 통합검색플랫폼팀

    추천사

    나는 CERT 안전한 코딩 이니셔티브(CERT Secure Coding Initiative)의 열렬한 지지자다. 프로그래머는 정확성, 명확성, 유지보수성, 성능, 심지어 안정성에 관해서도 여러 방법으로 조언을 구할 수 있다. 하지만 특정 언어의 특징이 보안에 미치는 영향은 다루고 있지 않다. 이 책 [버그 없는 안전한 소프트웨어를 위한 CERT® C 프로그래밍]이야말로 바로 이러한 요구를 충족시켜주는 책이다.
    - 랜디 마이어스 / ANSIC 회장

    수 년 간 우리는 CERT/CC를 통해 수없이 많은 보안 문제 대한 조언을 문서로 출간할 수 있었다. 이제 CERT는 최고 기술 전문가들의 제언을 책에 수록해 새로운 애플리케이션에서 발생할 수 있는 문제를 예방하고 기존 시스템을 안전하게 유지하도록 프로그래머와 매니저에게 실용적 길잡이 역할을 해준다.
    - Dr. 토머스 플럼 / 플럼홀 사 창시자

    연결성(connectivity)으로 인해 해커로부터 안전한 애플리케이션에 대한 필요성은 상당히 증가했다. 고객은 CERT 표준과 여타 안정성 가이드라인을 통해 완전한 보호와 무결함 등의 소프트웨어 목표를 달성할 수 있다.
    - 크리스 탭 / LDRA Ltd. 필드 애플리케이션즈 엔지니어

    이 책은 오늘날의 소프트웨어 시스템이 실제 상황에서 어떻게 실패하는지를 정확히 설명해주며, 우리에게 꼭 필요한 전문 정보의 모음이다. 내부적으로 안전한 코딩 가이드라인을 구축하기 위한 시작 단계로 이 책을 먼저 읽어보자. 다른 어떤 곳에서도 이런 정보를 얻을 수 없으며, 소프트웨어 보안 영역에서는 무지했던 부분이 종종 우리를 괴롭히는 결과로 드러난다.
    - 존 맥도널드 / [소프트웨어 보안 평가의 기술(The Art of Software Security Assessment)]의 공저자

    소프트웨어 보안은 조직의 운영과 자산뿐 아니라 개개인의 번영과도 중요한 관계가 있다. 안전한 소프트웨어를 만들기 위해 개발자는 어디에 위험이 도사리고 있는지 반드시 알아야 한다. C로 안전하게 프로그래밍하는 일은 숙련된 개발자들이 생각하는 것보다 더 어려울 수 있다.

    이 책은 C 개발자들의 필수 참고서적으로서 이 책을 통해 'CERT C Secure Coding Standard'를 처음으로 공식 배포하는 것이다. 본 표준은 C에서 발생하는 소프트웨어 취약성의 근본 원인이 되는 코딩 에러를 항목별로 분류하고 심각도, 침해 발생가능성, 사후관리 비용 등에 따라 분류해두었다. 각 가이드라인에서는 불안전한 코드의 예를 들고 이를 해결하는 방법을 함께 설명한다. 모든 가이드라인을 똑같이 적용했을 경우, 버퍼 오버플로, 포맷 문자열 취약성, 정수 오버플로, 일반적인 소프트웨어 취약점 등의 치명적인 코딩 에러를 제거할 수 있다.

    목차

    1장 표준 사용법
    시스템 품질
    자동 생성 코드
    표준 준수

    2장 전처리기(PRE)

    제안과 규칙
    위험 평가 요약
    관련 규칙과 제안
    PRE00-C. 함수형의 매크로보다는 인라인이나 정적 함수를 사용하라
    PRE01-C. 매크로에서는 매개변수에 괄호를 사용하라
    PRE02-C. 매크로로 치환될 영역은 반드시 괄호로 둘러싸야 한다
    PRE03-C. 타입 인코딩 시 매크로 정의 대신 타입 정의를 사용하라
    PRE04-C. 표준 헤더 파일 이름을 재사용하지 마라
    PRE05-C. 토큰들을 연결하거나 문자열 변환을 할 때 매크로 치환을 고려하라
    PRE06-C. 헤더 파일에 항상 인클루전 가드를 둬라
    PRE07-C. 연속되는 물음표를 사용하지 마라
    PRE08-C. 중복된 헤더 파일 이름이 없는지가 보장돼야 한다
    PRE09-C. 안전한 함수를 덜 안전한 함수로 바꾸지 마라
    PRE10-C. 복수 구문 매크로를 do-while 루프로 감싸라
    PRE30-C. 유니버설 문자열 이름을 여러 문자열을 붙여서 만들지 마라
    PRE31-C. 절대로 불안전한 매크로를 할당, 증가, 감소, 메모리 변수 접근, 함수 호출과 함께 사용하지 마라

    3장 선언과 초기화(DCL)

    제안과 규칙
    위험 평가 요약
    DCL00-C. 변하지 않는 객체는 const로 보장해둬라
    DCL01-C. 내부 스코프에서 변수 이름을 재사용하지 마라
    DCL02-C. 시각적으로 구별되는 식별자를 사용하라
    DCL03-C. 상수 수식의 값을 테스트할 때 정적 어썰션을 사용하라
    DCL04-C. 한 번에 여러 변수를 선언하지 마라
    DCL05-C. 코드의 가독성을 높이기 위해 타입 정의를 사용하라
    DCL06-C. 프로그램 로직상의 고정적인 값을 나타낼 때는 의미 있는 심볼릭 상수를 사용하라
    DCL07-C. 함수 선언 시 적절한 타입 정보를 포함시켜라
    DCL08-C. 상수 정의에서는 상수 간의 관계가 적절하게 나타나도록 정의하라
    DCL09-C. errno 에러 코드를 반환하는 함수의 반환 타입을 errno_t로 정의하라
    DCL10-C. 가변 인자를 가진 함수에서는 함수 작성자와 함수 사용자 간의 약속이 지켜져야 한다
    DCL11-C. 가변 인자 함수와 연관된 타입 문제를 파악하고 있어야 한다
    DCL12-C. 불투명한 타입을 사용해 추상 데이터 타입을 구현하라
    DCL13-C. 함수에 의해 바뀌지 않을 값에 대한 포인터를 함수의 매개변수로 사용할 때는 const로 정의하라
    DCL14-C. 여러 컴파일 단위를 거치는 전역 변수 초기화의 순서에 대해서는 어떤 가정도 하지 마라
    DCL15-C. 현재 범위를 넘어서까지 사용되지 않을 객체는 static으로 선언하라
    DCL30-C. 객체를 선언할 때 적절한 지속공간을 지정하라
    DCL31-C. 식별자를 사용하기 전에 먼저 선언하라
    DCL32-C. 서로에게 보이는 식별자가 유일한지를 보장하라
    DCL33-C. 함수 인자에서 restrict로 지정된 소스 포인터와 목적 포인터가 동일한 객체를 참조하지 않게 하라
    DCL34-C. 캐시될 수 없는 데이터에는 volatile을 사용하라
    DCL35-C. 함수 정의와 맞지 않는 타입으로 함수를 변환하지 마라
    DCL36-C. 링크 분류에서 충돌되는 식별자를 선언하지 마라

    4장 표현식(EXP)

    제안과 규칙
    위험 평가 요약
    관련 규칙과 제안
    EXP00-C. 연산자 우선순위를 나타내는 데 괄호를 사용하라
    EXP01-C. 포인터로 가리키는 타입의 크기를 결정하기 위해 포인터의 크기를 사용하지 마라
    EXP02-C. 논리 연산자 AND와 OR의 단축 평가 방식을 알고 있어라
    EXP03-C. 구조체의 크기가 구조체 멤버들 크기의 합이라고 가정하지 마라
    EXP04-C. 구조체끼리 바이트 단위로 비교하지 마라
    EXP05-C. const를 캐스트로 없애지 마라
    EXP06-C. sizeof의 피연산자가 다른 부수 효과를 가지면 안 된다
    EXP07-C. 표현식의 상수에 특정 값을 가정함으로써 상수를 사용해 얻는 이득을 없애지 마라
    EXP08-C. 포인터 연산이 정확하게 수행되고 있는지 보장하라
    EXP09-C. 타입이나 변수의 크기를 결정할 때는 sizeof를 사용하라
    EXP10-C. 하위 표현식의 평가 순서나 부수 효과가 발생할 수 있는 영역의 순서에 의존하지 마라
    EXP11-C. 호환되지 않는 타입들에는 연산자를 적용하지 마라
    EXP12-C. 함수에 의해 반환되는 값을 무시하지 마라
    EXP30-C. 시퀀스 포인트들 간의 평가 순서에 의존하지 마라
    EXP31-C. 어썰션의 부수 효과를 피하라
    EXP32-C. volatile 지정자를 캐스팅하여 없애지 마라
    EXP33-C. 초기화되지 않은 메모리를 참조하지 마라
    EXP34-C. 널포인터가 역참조되지 않음을 보장하라
    EXP35-C. 함수의 반환 값을 인접한 다음 시퀀스 포인트에서 접근하거나 수정하지 마라
    EXP36-C. 포인터를 더 엄격하게 할당된 포인터 타입으로 변환하지 마라
    EXP37-C. API에 의해 의도된 인자들로 함수를 호출하라
    EXP38-C. 유효하지 않은 타입이나 비트 필드 멤버들에 대해 offsetof()를 호출하지 마라

    5장 정수(INT)

    제안과 규칙
    위험 평가 요약
    관련 규칙과 제안
    INT00-C. 구현 시 사용되는 데이터 모델을 이해하고 있어라
    INT01-C. 객체의 크기를 나타내는 정수 값은 rsize_t나 size_t를 사용하라
    INT02-C. 정수 변환 규칙을 이해하라
    INT03-C. 안전한 정수 라이브러리를 사용하라
    INT04-C. 불분명한 소스에서 얻어지는 정수 값은 제한을 강제하라
    INT05-C. 모든 가능한 입력을 처리할 수 없다면 문자 데이터 변환을 위해 입력 함수를 사용하지 마라
    INT06-C. 문자열 토큰을 정수로 변환할 때는 strtol()이나 관련 함수를 사용하라
    INT07-C. 숫자 값에는 명시적으로 signed나 unsigned 값을 사용하라
    INT08-C. 모든 정수가 지정한 범위 내에 있음을 확인하라
    INT09-C. 열거형 상수가 유일한 값으로 매핑되도록 보장하라
    INT10-C. % 연산자를 쓸 때 나머지가 양수라고 가정하지 마라
    INT11-C. 정수를 포인터로 혹은 그 반대로 변환할 때 주의하라
    INT12-C. 표현식에서 signed, unsigned 표시가 없는 int 비트 필드의 타입을 가정하지 마라.
    INT13-C. 비트 연산자는 unsigned 피연산자에만 사용하라
    INT14-C. 동일한 데이터에 비트 연산자와 산술 연산자를 수행하지 마라
    INT15-C. 프로그래머 정의 정수 타입의 포맷 지정 I/O에 대해 intmax_t나 uintmax_t를 사용하라
    INT30-C. unsigned 정수 연산이 래핑되지 않도록 주의하라
    INT31-C. 정수 변환으로 데이터가 손실되거나 잘못 처리되지 않도록 주의하라
    INT32-C. signed 정수의 연산이 오버플로되지 않도록 보장하라
    INT33-C. 나눗셈이나 모듈로 연산에서 0으로 나누는 에러가 발생하지 않게 하라
    INT34-C. 음수나 피연산자의 비트보다 더 많은 비트를 시프트하지 마라
    INT35-C. 정수 표현식으로 비교하거나 할당할 때 더 큰 타입으로 표현식을 평가하라

    6장 부동소수점(FLP)

    제안과 규칙
    위험 평가 요약
    관련 규칙과 제안
    FLP00-C. 부동소수점 수의 제한을 이해하라
    FLP01-C. 부동소수점 표현식을 재배치할 때 주의하라
    FLP02-C. 정확한 계산이 필요할 때는 부동소수점 수를 배제할 수 있는지 고려하라
    FLP03-C. 부동소수점 에러를 발견하고 처리하라
    FLP30-C. 부동소수점 변수를 루프 카운터로 사용하지 마라
    FLP31-C. 함수에 복소수를 사용하면서 실제 값을 얻을 거라 기대하지 마라
    FLP32-C. 수학 함수에서 도메인 에러나 영역 에러를 찾고 예방하라
    FLP33-C. 부동소수점 연산용 정수는 먼저 부동소수점으로 바꿔라
    FLP34-C. 부동소수점 변환이 새로운 타입의 범위 안에 들어가는지 확인하라

    7장 배열(ARR)

    제안과 규칙
    위험 평가 요약
    관련 규칙과 제안
    ARR00-C. 배열이 어떻게 동작하는지 이해하라
    ARR01-C. 배열의 크기를 얻을 때 포인터를 sizeof의 피연산자로 사용하지 마라
    ARR02-C. 암시적으로 초기화된 경우라도 배열의 경계를 명시적으로 지정하라
    ARR30-C. 배열의 인덱스가 유효한 범위 안에 있음을 보장하라
    ARR31-C. 모든 소스 파일에서 일관된 배열 표기를 사용하라
    ARR32-C. 가변 배열에서 크기를 나타내는 인자가 유효한 범위에 있음을 보장하라
    ARR33-C. 충분한 크기의 공간에서 복사가 진행됨을 보장하라
    ARR34-C. 표현식에서 배열 타입이 호환 가능함을 보장하라
    ARR35-C. 루프에서 반복자가 배열의 끝을 넘어 접근하지 않게 하라
    ARR36-C. 같은 배열을 참조하고 있지 않다면 두 개의 포인터를 빼거나 비교하지 마라
    ARR37-C. 배열이 아닌 객체에 대한 포인터에 정수를 더하거나 빼지 마라
    ARR38-C. 반환 값이 유효한 배열 원소를 참조하고 있지 않은 경우 포인터에 정수를 더하거나 빼지 마라

    8장 문자와 문자열(STR)

    제안과 규칙
    위험 평가 요약
    관련 규칙과 제안
    STR00-C. 적절한 타입으로 문자를 표현하라
    STR01-C. 문자열 관리를 위해 일관된 계획을 사용해 일관되게 구현하라
    STR02-C. 복잡한 하위 시스템으로 전달되는 데이터를 검열하라
    STR03-C. 널문자로 종료된 문자열이 부적절하게 잘리지 않게 하라
    STR04-C. 기본 문자 집합에서는 문자들을 위해 char를 사용하라
    STR05-C. 문자열 상수를 가리키는 포인터는 const로 선언하라
    STR06-C. strtok()에서 파싱되는 문자열이 보존된다고 가정하지 마라
    STR07-C. 문자열을 처리하는 코드를 수정할 때는 TR 24731을 사용하라
    STR08-C. 문자열을 처리하는 새로운 코드를 개발할 때 관리 문자열을 사용하라
    STR30-C. 문자열 리터럴을 수정하려고 하지 마라
    STR31-C. 문자열을 위한 공간이 문자 데이터와 널 종료 문자를 담기에 충분함을 보장하라
    STR32-C. 요구되는 대로 문자열을 널문자로 종료하라
    STR33-C. 와이드 문자 스트링의 크기를 정확히 하라
    STR34-C. 문자들을 더 큰 타입인 정수로 변환하기 전에 unsigned 타입으로 캐스팅하라
    STR35-C. 경계가 불분명한 소스로부터 고정된 길이의 배열에 데이터를 복사하지 마라
    STR36-C. 문자열 리터럴로 초기화된 문자 배열의 경계를 지정하지 마라
    STR37-C. 문자를 처리하는 함수로 전달되는 인자는 반드시 unsigned char로 표현 가능해야 한다

    9장 메모리 관리(MEM)

    제안과 규칙
    위험 평가 요약
    관련 규칙과 제안
    MEM00-C. 동일한 추상화 레벨의 같은 모듈 안에서 메모리를 할당하고 해제하라
    MEM01-C. free() 후 즉시 포인터에 새로운 값을 저장하라
    MEM02-C. 메모리 할당 함수의 반환 값을 즉시 할당된 타입의 포인터로 변환시켜라
    MEM03-C. 재사용을 위해 반환된 재사용 가능한 리소스에 있는 중요한 정보를 클리어하라
    MEM04-C. 크기가 0인 할당을 수행하지 마라
    MEM05-C. 큰 스택 할당을 피하라
    MEM06-C. 중요한 데이터가 디스크에 기록되지 않도록 보장하라
    MEM07-C. calloc()의 인자가 곱해지는 경우 size_t로 표현될 수 있게 하라
    MEM08-C. 동적으로 할당된 배열을 리사이즈하는 경우에만 realloc()을 사용하라
    MEM09-C. 메모리 할당 루틴이 메모리를 초기화해줄 것이라 가정하지 마라
    MEM10-C. 포인터 검증 함수를 사용하라
    MEM30-C. 해제된 메모리에 접근하지 마라
    MEM31-C. 동적으로 할당된 메모리는 한 번만 해제하라
    MEM32-C. 메모리 할당 에러를 찾아 해결하라
    MEM33-C. 유연한 배열 원소에 정확한 문법을 사용하라
    MEM34-C. 동적으로 할당된 메모리만 해제하라
    MEM35-C. 객체에 충분한 메모리를 할당하라

    10장 입력과 출력(FIO)

    제안과 규칙
    위험 평가 요약
    관련 규칙과 제안
    FIO00-C. 포맷 문자열을 사용할 때 주의하라
    FIO01-C. 파일 이름이나 식별자를 사용하는 함수를 쓸 때 주의하라
    FIO02-C. 신뢰할 수 없는 소스로부터 얻은 경로 이름을 정형화해 사용하라
    FIO03-C. fopen()이나 파일 생성에 대해 특정 조건을 가정하지 마라
    FIO04-C. 입출력 에러를 찾아 해결하라
    FIO05-C. 여러 파일 속성을 통해 파일을 식별하라
    FIO06-C. 적절한 접근 권한으로 파일을 생성하라
    FIO07-C. rewind()보다 fseek()을 사용하라
    FIO08-C. 열린 파일에 대해 remove()를 호출할 때 주의하라
    FIO09-C. 시스템 간에 바이너리 데이터를 전송할 때는 주의하라
    FIO10-C. rename() 함수를 사용할 때는 주의하라
    FIO11-C fopen()의 모드 매개변수를 지정할 때 주의하라
    FIO12-C. setbuf()보다 setvbuf()를 사용하라
    FIO13-C. 방금 읽은 한 개의 문자 외의 것을 다시 넣지 마라
    FIO14-C. 파일 스트림에서 텍스트 모드와 바이너리 모드의 차이를 이해하라
    FIO15-C. 파일 연산이 안전한 디렉토리에서 수행되고 있음을 보장하라
    FIO16-C. jail을 만들어 파일 접근을 제한하라
    FIO30-C. 포맷 문자열에서 사용자 입력을 배제하라
    FIO31-C. 동시에 같은 파일을 여러 번 열지 마라
    FIO32-C. 파일에만 적용 가능한 연산을 장치에 대해 수행하지 마라
    FIO33-C. 정의되지 않은 동작을 초래하는 입출력 에러를 발견하고 처리하라
    FIO34-C. 문자 I/O 함수의 반환 값을 캡처할 때는 int를 사용하라
    FIO35-C. sizeof(int) == sizeof(char)일 때는 EOF나 파일 에러를 찾기 위해 feof()와 ferror()를 사용하라
    FIO36-C. fgets()를 사용할 때 개행문자가 읽힌다고 가정하지 마라
    FIO37-C. 문자 데이터를 읽었다고 가정하지 마라
    FIO38-C. 입출력 FILE 객체를 복사해 사용하지 마라
    FIO39-C. 플러시나 위치 조정 함수 호출 없이 스트림으로부터 입출력을 교대로 수행하지 마라
    FIO40-C. fgets() 실패 시 문자열을 리셋하라
    FIO41-C. 부수 효과가 있는 스트림 인자로 getc()나 putc()를 호출하지 마라
    FIO42-C. 더 이상 필요 없어진 파일이 적절히 닫혔는지 확인하라
    FIO43-C. 공유 디렉토리에 임시 파일을 생성하지 마라
    FIO44-C. fsetpos()에는 fgetpos()에서 반환된 값만 사용하라

    11장 환경(ENV)

    제안과 규칙
    위험 평가 요약
    관련 규칙과 제안
    ENV00-C. getenv()에서 반환한 문자열을 가리키는 포인터를 저장하지 마라
    ENV01-C. 환경변수의 크기를 함부로 가정하지 마라
    ENV02-C. 이름이 같은 여러 개의 환경변수가 존재할 수 있음을 알아두자
    ENV03-C. 외부 프로그램을 호출할 때는 환경변수를 정리하라
    ENV04-C. 커맨드 프로세서가 필요하지 않다면 system()을 호출하지 마라
    ENV30-C. getenv()가 반환한 문자열을 수정하지 마라
    ENV31-C. 환경변수의 값을 무효화할 수 있는 연산을 수행했다면 더 이상 그 값에 의존하지 마라
    ENV32-C. atexit 핸들러는 반환 외의 방법으로 종료돼선 안 된다

    12장 시그널(SIG)

    제안과 규칙
    위험 평가 요약
    관련 규칙과 제안
    SIG00-C. 인터럽트될 수 없는 시그널 핸들러로 처리되는 시그널을 마스크하라
    SIG01-C. 구현마다 다른 시그널 핸들러의 지속성에 대한 세부사항을 이해하라
    SIG02-C. 일반적인 기능을 구현하는 경우에는 시그널의 사용을 피하라
    SIG30-C. 시그널 핸들러에서는 비동기적으로 안전한 함수만 호출하라
    SIG31-C. 시그널 핸들러에서 공유 객체에 접근하거나 수정하지 마라
    SIG32-C. 시그널 핸들러 안에서 longjmp()를 호출하지 마라
    SIG33-C. raise() 함수를 재귀적으로 호출하지 마라
    SIG34-C. 인터럽트 가능한 시그널 핸들러 안에서 signal()을 호출하지 마라

    13장 에러 처리(ERR)

    제안과 규칙
    위험 평가 요약
    관련 규칙과 제안
    ERR00-C. 일관되고 이해할 수 있는 에러 처리 정책을 적용하고 구현하라
    ERR01-C. FILE 스트림 에러 체크 시 errno보다 ferror()를 사용하라
    ERR02-C. in-band 에러 표시자를 피하라
    ERR03-C. TR 24731-1에 정의된 함수를 호출할 때는 런타임 지정 핸들러를 사용하라
    ERR04-C. 적절한 종료 방법을 선택하라
    ERR05-C. 애플리케이션 독립적인 코드는 별도의 에러 처리 설명이 없는 에러 감지 코드를 제공해야 한다
    ERR06-C. assert()와 abort()의 종료 시 동작을 이해하라
    ERR30-C. errno를 사용하는 라이브러리 함수를 호출하기 전에 errno 값을 0으로 설정하고, 함수가 에러를 의미하는 값을 반환했을 때는 errno 값을 체크하라
    ERR31-C. errno를 재정의하지 마라
    ERR32-C. 애매한 errno 값에 의존하지 마라

    14장 기타(MSC)

    제안과 규칙
    위험 평가 요약
    MSC00-C. 컴파일 시 높은 경고 메시지 옵션을 줘라
    MSC01-C. 논리적으로 완전해지도록 노력하라
    MSC02-C. 실수로 누락하지 않도록 하라
    MSC03-C. 실수로 추가하지 않도록 하라
    MSC04-C. 주석은 일관되고 가독성 있게 사용하라
    MSC05-C. time_t 타입 값을 직접 조작하지 마라
    MSC06-C. 중요한 데이터를 다룰 때는 컴파일러 최적화를 고려하라
    MSC07-C. 죽은 코드를 찾아 제거하라
    MSC08-C. 라이브러리 함수는 자신의 매개변수를 검증해야 한다
    MSC09-C. 문자 인코딩: 안전을 위해 ASCII의 부분집합을 사용하라
    MSC10-C. 문자 인코딩: UTF-8 관련 이슈
    MSC11-C. 어썰션을 사용한 부적절한 진단 테스트
    MSC12-C. 아무 효과도 없는 코드를 찾아 제거하라
    MSC13-C. 사용되지 않는 값을 찾아 제거하라
    MSC14-C. 불필요하게 플랫폼 의존성을 끌어들이지 마라
    MSC15-C. 정의되지 않은 동작에 의존하지 마라
    MSC30-C. 의사난수를 만들기 위해 rand() 함수를 사용하지 마라
    MSC31-C. 반환 값이 적절한 타입으로 비교되는지 보장하라

    부록 POSIX(POS)

    제안과 규칙
    위험 평가 요약
    관련 규칙과 제안
    POS00-C. 멀티스레드의 경쟁 상태를 피하라
    POS01-C. 링크의 유무를 확인하라
    POS02-C. 가장 적은 권한의 원리를 따르라
    POS30-C. readlink() 함수를 알맞게 사용하라
    POS31-C. 다른 스레드 뮤텍스를 잠금해제하거나 없애지 마라
    POS32-C. 멀티스레드 환경에서 비트 필드를 사용할 때는 뮤텍스를 도입하라
    POS33-C. vfork()를 사용하지 마라
    POS34-C. putenv()에 자동 변수에 대한 포인터를 인자로 전달하지 마라
    POS35-C. 심볼릭 링크를 체크할 때 교착 상태를 피하라
    POS36-C. 권한을 취소할 때 해제 순서가 올바른지 확인하라
    POS37-C. 권한 취소가 성공적으로 수행됐는지 보장하라

    본문중에서

    많은 사람들이 C언어는 프로그래밍의 기초가 되는 언어라고 합니다. 그리고 실제로도 플랫폼의 특성을 잘 활용한 좋은 성능의 시스템을 구현할 때도 C언어를 많이 합니다. 하지만 이렇게 중요한 프로그래밍 언어를 안전하게 프로그래밍 하는 방법에 대한 책이 국내에 많이 소개되지는 않았습니다. 비슷한 책으로 오래 전인 2004년에 『C 함정과 실수(원서명 C Traps and Pitfalls)』라는 책이 출간된 적이 있는데, 이 책은 그보다 더 실무적인 차원에서 접근하고 있습니다.

    이 책은 제목 그대로 버그 없이, 신뢰도와 보안성이 높은 소프트웨어 개발을 위해 좀 더 안전하게 C 프로그래밍을 할 수 있도록 도와주는 책입니다. 프로그래밍 언어 자체를 소개하는 일반 학습서에는 기술되지 않지만 실무에 적용할 때 반드시 부딪히게 되는 어려운 부분들이나 그 동안 살 떨리는 경험을 통해서만 알 수 있었던 고급 개발자들의 안전한 코딩에 대한 노하우가 이 책에 체계적으로 정리되어 있습니다. 따라서 고급 프로그래머의 코딩 노하우를 알고 싶거나, 안전한 C 코드를 짜고 싶다면 이 책을 당장 읽으시라고 추천합니다. 이 책이 정말 그러한 노하우를 제공해 줄 것인지는 당장 이 책의 2장~14장 중 아무 곳이나 펴보시면 금세 느끼실 것입니다.

    다만 이 책에서 공개한 노하우들은 그냥 술술 읽기 쉽게 기술되어 있지는 않습니다. 저자는 이 책의 내용이 일종의 표준으로 사용될 수 있도록 의도했고, 때문에 안전한 코딩에 대한 모든 항목을 규칙과 제안으로 정리했으며, 각 규칙이나 제안에는 이를 지키지 않을 경우 얼마나 위험한지에 대한 평가도 제시해줍니다. 경우에 따라서는 이 책의 내용을 기준으로 코드의 안전성을 테스트하는 도구도 개발할 수 있도록 구성했습니다.

    따라서 원문에서조차 '이런 식으로 코딩하면 해킹 당하기 쉽다'라고 하면 될 것을 '이 규칙을 위반할 경우 의도하지 않은 권한을 사용해 악의적인 사용자가 임의의 코드를 수행할 가능성이 존재한다'와 같이 다소 딱딱한 표현을 사용해 아주 구체적으로 기술하고 있습니다. 따라서 저 역시 이 책을 조직에서 개발 표준이나 규칙으로 사용할 가능성을 고려해 원문의 의도를 살려 번역했음을 미리 일러둡니다.

    초급 프로그래머라면 각 제안과 규칙에 등장하는 용어들에 익숙하지 않을 수도 있습니다. 이러한 경우라면 책 뒤쪽의 용어해설 부분을 먼저 읽으시는 편이 좋습니다. 예를 들어 원문의 Implementation이 플랫폼 혹은 구현된 대상이라는 의미로 사용되는 경우가 있음을 용어해설 절에서 먼저 숙지하면 해당 용어를 사용한 부분을 이해하기 쉬울 것입니다. 그 외의 용어들은 필요에 따라 각주를 통해 설명했습니다.

    일반적으로 보안이라고 하면 관공서나 금융 기관에서 사용하는 매우 높은 신뢰도를 요구하는 프로그램만을 생각할 수 있는데, 이 책의 코딩 규칙이나 제안들은 그러한 소프트웨어 보안 영역뿐만 아니라 일반적인 경우에도 필요합니다. 보안이 필요 없다고 해서 안전하지 않은 방식으로 프로그램을 작성한다면 버그 등 여러 문제를 지닌 소프트웨어를 만들 수 있는데, 아무도 자신이 개발한 소프트웨어가 문제와 버그로 가득 차기를 바라지는 않으니까요. 이 책은 두 가지 경우를 모두 염두에 두고 있으니 잘 읽어보시고 책의 내용을 통해 익힌 안전한 프로그래밍 방식으로 소프트웨어의 신뢰도와 보안성을 높여보시기 바랍니다.
    (/ 옮긴이의 말 중에서)

    저자소개

    로버트 C. 시코드(Robert C. Seacord) [저] 신작알림 SMS신청 작가DB보기
    생년월일 -
    출생지 -
    출간도서 3종
    판매수 209권

    펜실베니아 피츠버그에 있는 카네기 멜론 소프트웨어 공학 연구소 CERT부서의 보안코딩 기술관리자이며, 카네기 멜론 대학교의 컴퓨터과학대학 및 정보 네트워크 연구소의 교수이다. 소프트웨어 보안, 컴포넌트-기반 소프트웨어 공학, 웹-기반 시스템 설계, 시스템 현대화, 컴포넌트 저장소와 검색엔진 그리고 사용자 인터페이스와 개발에 관련된 60편 이상의 논문을 발표했다.

    생년월일 -
    출생지 -
    출간도서 0종
    판매수 0권

    서울대학교 컴퓨터공학부를 졸업하고 보안 업체와 스마트폰 개발 업체를 거쳐 현재는 NHN에서 검색서버와 관련된 기술을 연구하고 있다. 네이버 통합검색 결과의 HTML 렌더링 코드를 개발하고 운영했으며, OpenAPI의 개발과 운영도 담당하며 매시업 컨퍼런스에서 강연도 진행했다. 현재는 HTML5를 사용해 검색서버 성능 모니터링 시스템을 개발하고 있다. 하드웨어부터 소프트웨어까지 다양한 개발 경험이 있으며 최근에는 오픈소스에 관심을 보인다는 소문이 있다. 옮긴 책으로 『버그 없는 안전한 소프트웨어를 위한 CERT C 프로그래밍』(에이콘출판, 2010)이 있다.

    이 상품의 시리즈

    에이콘 해킹과 보안 시리즈(총 117권 / 현재구매 가능도서 84권)

    펼쳐보기

    이 책과 내용이 비슷한 책 ? 내용 유사도란? 이 도서가 가진 내용을 분석하여 기준 도서와 얼마나 많이 유사한 콘텐츠를 많이 가지고 있는가에 대한 비율입니다.

      리뷰

      0.0 (총 0건)

      구매 후 리뷰 작성 시, 북피니언 지수 최대 600점

      리뷰쓰기

      기대평

      작성시 유의사항

      평점
      0/200자
      등록하기

      기대평

      10.0

      교환/환불

      교환/환불 방법

      ‘마이페이지 > 취소/반품/교환/환불’ 에서 신청함, 1:1 문의 게시판 또는 고객센터(1577-2555) 이용 가능

      교환/환불 가능 기간

      고객변심은 출고완료 다음날부터 14일 까지만 교환/환불이 가능함

      교환/환불 비용

      고객변심 또는 구매착오의 경우에만 2,500원 택배비를 고객님이 부담함

      교환/환불 불가사유

      반품접수 없이 반송하거나, 우편으로 보낼 경우 상품 확인이 어려워 환불이 불가할 수 있음
      배송된 상품의 분실, 상품포장이 훼손된 경우, 비닐랩핑된 상품의 비닐 개봉시 교환/반품이 불가능함

      소비자 피해보상

      소비자 피해보상의 분쟁처리 등에 관한 사항은 소비자분쟁해결기준(공정거래위원회 고시)에 따라 비해 보상 받을 수 있음
      교환/반품/보증조건 및 품질보증 기준은 소비자기본법에 따른 소비자 분쟁 해결 기준에 따라 피해를 보상 받을 수 있음

      기타

      도매상 및 제작사 사정에 따라 품절/절판 등의 사유로 주문이 취소될 수 있음(이 경우 인터파크도서에서 고객님께 별도로 연락하여 고지함)

      배송안내

      • 인터파크 도서 상품은 택배로 배송되며, 출고완료 1~2일내 상품을 받아 보실 수 있습니다

      • 출고가능 시간이 서로 다른 상품을 함께 주문할 경우 출고가능 시간이 가장 긴 상품을 기준으로 배송됩니다.

      • 군부대, 교도소 등 특정기관은 우체국 택배만 배송가능하여, 인터파크 외 타업체 배송상품인 경우 발송되지 않을 수 있습니다.

      • 배송비

      도서(중고도서 포함) 구매

      2,000원 (1만원이상 구매 시 무료배송)

      음반/DVD/잡지/만화 구매

      2,000원 (2만원이상 구매 시 무료배송)

      도서와 음반/DVD/잡지/만화/
      중고직배송상품을 함께 구매

      2,000원 (1만원이상 구매 시 무료배송)

      업체직접배송상품 구매

      업체별 상이한 배송비 적용