다음을 통해 공유


CRT의 보안 기능

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

이 컨텍스트에서 "사용되지 않음"은 함수를 사용하지 않는 것이 좋습니다. 이는 함수가 CRT에서 제거되는 것을 의미하지는 않습니다.

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

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

사용되지 않음 경고 제거

보안 수준이 떨어지는 이전 함수에 대한 사용되지 않음 경고는 여러 가지 방법으로 제거할 수 있습니다. 가장 간단한 방법은 pragma를 정의 _CRT_SECURE_NO_WARNINGS 하거나 사용하는 warning 것입니다. 사용 중단 경고를 사용하지 않도록 설정하지만 경고를 발생시킨 보안 문제는 여전히 존재합니다. 사용 중단 경고를 사용하도록 설정하고 새 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_WARNINGSPOSIX 관련 사용 중단 경고를 사용하지 않도록 설정합니다. 자세한 내용은 호환성을 참조하세요.

추가 보안 기능

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

  • 매개 변수 유효성 검사

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

    • NULL 값을 확인합니다.
    • 열거형 값의 유효성
    • 정수 계열 값이 유효 범위 내에 있는지 여부

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

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

  • 크기가 큰 버퍼

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

  • Null 종료

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

  • 향상된 오류 보고

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

  • 파일 시스템 보안

    안전한 파일 I/O API는 default case에서 안전한 파일 액세스를 지원합니다.

  • Windows 보안

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

  • 형식 문자열 구문 검사

    예를 들어 형식 문자열에서 잘못된 형식 필드 문자를 printf 사용하는 경우 잘못된 문자열이 검색됩니다.

참고 항목

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