Поделиться через


Функции безопасности в CRT

Многие старые функции CRT имеют новые более безопасные версии. Если безопасная функция существует, то старая менее безопасная версия помечена как нерекомендуемая, а новая версия имеет суффикс _s ("secure" — "безопасный").

В этом контексте "не рекомендуемая" означает только то, что использование этой функции не рекомендуется; это не означает, что функцию планируется удалить из CRT.

Безопасные функции не предотвращают или исправляют ошибки безопасности; вместо этого они перехватывают ошибки при их возникновении. Они выполняют дополнительные проверки на выполнение условий возникновения ошибки, а в случае ошибки вызывают обработчик ошибок (см. Проверка параметров).

Например, функция strcpy не может сообщить о том, что копируемая строка слишком велика для буфера назначения. Однако ее безопасный аналог, strcpy_s, принимает размер буфера в качестве одного из параметров, так что она может определить, произойдет ли переполнение буфера. Использование strcpy_s для копирования одиннадцати символов в буфер из десяти символов является вашей ошибкой; strcpy_s не может устранить пользовательскую ошибку, но она может обнаружить эти ошибки и предупредить о них путем вызова обработчика недопустимого параметра.

Удаление предупреждений о нерекомендуемых функциях

Существует несколько способов удаления предупреждений о нерекомендуемых функциях для старых менее безопасных функций. Самый простой — указать _CRT_SECURE_NO_WARNINGS или использовать директиву pragma 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) или отключите связанные с POSIX предупреждения о нерекомендуемых функциях, указав _CRT_NONSTDC_NO_WARNINGS. Для получения дополнительной информации см. Deprecated CRT Functions.

Дополнительные возможности безопасности

Некоторые возможности безопасности включают в себя:

  • Parameter Validation. Параметры, переданные в функции CRT, проверяются и в безопасных функциях, и во многих существовавших ранее версиях функций. Эти проверки включают в себя:

    • Проверка на значение NULL, переданное в функции.

    • Проверка допустимости перечислимых значений.

    • Проверка принадлежности целочисленных значений допустимым диапазонам.

  • Для получения дополнительной информации см. Проверка параметров.

  • Обработчик недопустимых параметров также доступен разработчику. После обнаружения недопустимого параметра, вместо использования утверждений и выхода из приложения, CRT предоставляет способ проверить возникшие проблемы функцией _set_invalid_parameter_handler.

  • Sized Buffers. Безопасные функции требуют передачи размера буфера в любую функцию, которая пишет в буфер. Безопасные версии проверяют, что буфер достаточно велик, перед записью в него, это помогает избежать опасных ошибок переполнений буфера, которые могут допустить выполнение вредоносного кода. Обычно эти функции возвращают тип кода ошибки errno и вызывают обработчик недопустимого параметра, если размер буфера слишком мал. Функции, читающие данные из буферов ввода, например gets, имеют безопасные версии, в которых требуется указать максимальный размер.

  • Null termination. Некоторые функции, которые могут оставить строку незавершенной, имеют безопасные версии, гарантирующие, что строки правильно завершаются нулевым символом.

  • Enhanced error reporting. Коды ошибок, возвращаемые безопасными функциями, содержат более подробные сведения об ошибке, чем существовавшие ранее функции. Безопасные функции и многие функции существовавшие ранее функции сейчас устанавливают errno и часто также возвращают тип кода errno, чтобы обеспечить лучшие отчеты об ошибках.

  • Filesystem security. API безопасного файлового ввода-вывод по умолчанию защищает доступ к файлам.

  • Windows security. Безопасное API для работы с процессами принудительно активирует политику безопасности и позволяет указать ACL.

  • Format string syntax checking. Обнаружены недопустимые строки, например, использование некорректных символов поля типа в строке формата printf.

См. также

Ссылки

Безопасные перегрузки шаблонов

Функции библиотеки CRT

Основные понятия

Проверка параметров