다음을 통해 공유


CRT의 보안 기능

많은 이전 CRT 함수에는 더 안전한 최신 버전이 있습니다. 보안 함수가 있는 경우 이전의 덜 안전한 버전은 더 이상 사용되지 않는 것으로 표시됩니다. 새 버전에는 _s ("secure") 접미사가 있습니다.

이 문맥에서 "권장되지 않음"은 함수를 사용하는 것이 권장되지 않는다는 의미입니다. 이는 함수가 CRT에서 제거되는 것을 의미하지는 않습니다.

보안 함수는 보안 오류를 방지하거나 수정하지 않습니다. 오류가 발생할 때 대신 그 오류를 포착합니다. 오류 조건에 대한 추가 검사를 수행합니다. 오류가 있는 경우 오류 처리기를 호출합니다( 매개 변수 유효성 검사 참조).

예를 들어 복사하는 strcpy 문자열이 대상 버퍼에 비해 너무 큰지 알 수 없습니다. 해당 보안 대응 strcpy_s항목은 버퍼의 크기를 매개 변수로 취합니다. 따라서 버퍼 오버런이 발생하는지 여부를 확인할 수 있습니다. 11자를 10자 버퍼에 복사하기 위해 strcpy_s을(를) 사용하면 그것은 당신의 실수입니다. strcpy_s으로는 그 실수를 수정할 수 없습니다. 그러나 오류를 감지하고 잘못된 매개 변수 처리기를 호출하여 사용자에게 알릴 수 있습니다.

사용 중지 경고 메시지 제거

이전의 덜 안전한 함수에 대한 사용 중단 경고를 제거하는 방법에는 여러 가지가 있습니다. 가장 간단한 방법은 _CRT_SECURE_NO_WARNINGS을 정의하거나 warning pragma를 사용하는 것입니다. 사용 중단 경고를 사용하지 않도록 설정하지만 경고를 발생시킨 보안 문제는 여전히 존재합니다. 사용 중단 경고 메시지를 활성화시킨 채로 두고 새 CRT 보안 기능을 적극적으로 활용하는 것이 더 낫습니다.

C++에서 사용 중단 경고를 제거하는 가장 쉬운 방법은 보안 템플릿 오버로드를 사용하는 것입니다. 오버로드는 대부분의 경우 사용 중단 경고를 제거합니다. 더 이상 사용되지 않는 함수에 대한 호출을 보안 버전의 함수에 대한 호출로 바꿉니다. 예를 들어 이 더 이상 사용되지 않는 호출은 다음과 같습니다.strcpy

char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated

_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES을 1로 정의하여 strcpy 호출을 strcpy_s로 바꾸면 경고가 제거되고, 이를 통해 버퍼 오버런을 방지합니다. 자세한 내용은 안전한 템플릿 오버로드를 참조하세요.

보안 템플릿 오버로드가 없는 더 이상 사용되지 않는 함수의 경우 보안 버전을 사용하도록 코드를 수동으로 업데이트하는 것이 좋습니다.

보안과 관련이 없는 사용 중단 경고의 또 다른 원인은 POSIX 함수입니다. POSIX 함수 이름을 표준 등가 항목으로 바꾸세요(예: access_access로 변경). 또는 _CRT_NONSTDC_NO_WARNINGS를 정의하여 POSIX 관련 사용 중단 경고를 비활성화하세요. 자세한 내용은 호환성을 참조하세요.

추가 보안 기능

일부 보안 기능은 다음과 같습니다.

  • 매개 변수 유효성 검사

    보안 함수 및 많은 보안되지 않은 함수는 매개 변수의 유효성을 검사합니다. 유효성 검사에는 다음이 포함될 수 있습니다.

    • NULL 값을 확인합니다.
    • 유효성에 대한 열거형 값 확인
    • 정수 값이 유효한 범위에 있는지 확인합니다.

    자세한 내용은 매개 변수 유효성 검사를 참조하세요.

    잘못된 매개 변수에 대한 처리기도 개발자가 액세스할 수 있습니다. 함수가 잘못된 매개 변수를 발견했을 때 애플리케이션을 종료하고 어설션하는 대신, CRT를 통해_set_invalid_parameter_handler 또는 _set_thread_local_invalid_parameter_handler 이러한 문제를 확인할 수 있습니다.

  • 크기가 큰 버퍼

    버퍼 크기를 버퍼에 쓰는 보안 함수에 전달해야 합니다. 보안 버전은 버퍼에 쓰기 전에 버퍼가 충분히 큰지 확인합니다. 유효성 검사를 통해 악성 코드를 실행할 수 있는 위험한 버퍼 오버런 오류를 방지할 수 있습니다. 이러한 함수는 일반적으로 오류 코드를 반환 errno 하고 버퍼의 크기가 너무 작은 경우 잘못된 매개 변수 처리기를 호출합니다. 같은 gets입력 버퍼에서 읽은 함수에는 최대 크기를 지정해야 하는 보안 버전이 있습니다.

    일부 보안 강화 CRT 함수의 디버그 버전은 전달된 버퍼를 특수 문자(0xFE)로 채웁니다. 이 채우기 문자는 잘못된 크기가 함수에 전달된 사례를 찾는 데 도움이 됩니다. 아쉽게도 성능도 저하됩니다. 성능을 향상시키려면 버퍼 채우기를 사용하지 않도록 설정하는 데 사용합니다 _CrtSetDebugFillThreshold . 자세한 내용 및 이 동작이 있는 함수 목록은 다음을 참조하세요 _CrtSetDebugFillThreshold.

  • Null 종료

    잠재적으로 정의되지 않은 문자열을 남긴 일부 함수에는 보안 버전이 있으므로 문자열이 제대로 null로 종료됩니다.

  • 향상된 오류 보고

    보안 함수는 기존 함수에서 사용할 수 있었던 것보다 많은 오류 정보가 포함된 오류 코드를 반환합니다. 보안 함수 및 많은 기존 함수는 이제 더 나은 오류 보고를 제공하기 위해 errno를 설정하며, 자주 errno 코드 유형을 반환합니다.

  • 파일 시스템 보안

    보안 파일 I/O API는 기본 사례에서 보안 파일 액세스를 지원합니다.

  • Windows 보안

    보안 프로세스 API는 보안 정책을 적용하고 ACL을 지정할 수 있도록 허용합니다.

  • 형식 문자열 구문 검사

    예를 들어, printf 형식 문자열을 사용할 때 잘못된 형식 필드 문자를 사용하는 경우 잘못된 문자열이 감지됩니다.

참고하십시오

매개 변수 유효성 검사
보안 템플릿 오버로드
C 런타임(CRT) 및 C++ STL(표준 라이브러리) .lib 파일