Características de seguridad de CRT

Muchas funciones anteriores de CRT tienen versiones nuevas y más seguras. Si existe una función segura, la versión anterior y menos segura está marcada como desusada y la nueva versión presenta el sufijo _s ("segura").

En este contexto, "en desuso" significa que no se recomienda usar la función . No significa que la función esté programada para quitarse de CRT.

Las funciones seguras no impiden ni corrigen errores de seguridad. En su lugar, detectan errores cuando se producen. Realizan comprobaciones adicionales de las condiciones de error. Si se produce un error, invocan un controlador de errores (vea Validación de parámetros).

Por ejemplo, la función no puede saber si la cadena que está copiando strcpy es demasiado grande para el búfer de destino. Su homólogo seguro, strcpy_s , toma el tamaño del búfer como parámetro. Por lo tanto, puede determinar si se producirá una saturación del búfer. Si usa para copiar 11 caracteres en un búfer de 10 caracteres, es un error por su parte; no strcpy_s puede corregir el strcpy_s error. Pero puede detectar el error e informar mediante la invocación del controlador de parámetros no válidos.

Eliminación de advertencias sobre desuso

Hay varias maneras de eliminar las advertencias sobre desuso de las funciones más antiguas y menos seguras. La más sencilla consiste simplemente en definir _CRT_SECURE_NO_WARNINGS o en usar el pragma _CRT_SECURE_NO_WARNINGS. Cualquiera de las dos deshabilitará las advertencias de desuso, pero los problemas de seguridad que provocaron las advertencias siguen existiendo. Es mejor dejar habilitadas las advertencias de desuso y aprovechar las nuevas características de seguridad de CRT.

En C++, la manera más fácil de hacerlo es usar sobrecargas de plantilla seguras. Esto eliminará las advertencias de desuso, en muchos casos, reemplazando las llamadas a funciones en desuso por llamadas a versiones seguras de esas funciones. Por ejemplo, considere esta llamada en desuso a strcpy:

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

Al definir _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES como 1, se elimina la advertencia cambiando la llamada a strcpy por strcpy_s, lo que evita las saturaciones del búfer. Para obtener más información, vea Sobrecargas de plantilla seguras.

En el caso de estas funciones en desuso sin sobrecargas de plantillas seguras, debe considerar en última instancia actualizar manualmente el código para usar las versiones seguras.

Otro origen de las advertencias sobre desuso, no relacionadas con la seguridad, son las funciones POSIX. Reemplace los nombres de funciones POSIX por sus equivalentes estándar (por ejemplo, cambie access por _access), o bien deshabilite las advertencias sobre desuso relacionadas con POSIX mediante la definición de . Para obtener más información, vea Compatibilidad.

Características de seguridad adicionales

Algunas de las características de seguridad incluyen:

  • Parameter Validation. Las funciones seguras y muchos de sus homólogos no seguros validan los parámetros. La validación puede incluir:

    • Comprobación de valores NULL.
    • Comprobar la validez de los valores enumerados.
    • Comprobar si los valores de enteros se encuentran en intervalos válidos.
  • Para más información, consulte Validación de parámetros.

  • El desarrollador también puede acceder a un controlar de parámetros no válidos. Cuando una función encuentra un parámetro no válido, en lugar de aserr y salir de la aplicación, CRT permite comprobar estos problemas a través de _set_invalid_parameter_handler, _set_thread_local_invalid_parameter_handler.

  • Sized Buffers. Debe pasar el tamaño del búfer a cualquier función segura que escriba en un búfer. Las versiones seguras validan que el búfer es lo suficientemente grande antes de escribir en él. Esto ayuda a evitar errores peligrosos de saturación del búfer que podrían permitir la ejecución de código malintencionado. Estas funciones normalmente devuelven un código de error e invocan al controlador de parámetros no válidos errno si el tamaño del búfer es demasiado pequeño. Las funciones que leen de los búferes de entrada, como gets, tienen versiones seguras que requieren que se especifique un tamaño máximo.

  • Null termination. Algunas funciones que dejaron cadenas potencialmente no terminadas tienen versiones seguras, que garantizan que las cadenas terminen correctamente en null.

  • Enhanced error reporting. Las funciones seguras devuelven códigos de error con más información de error de la que estaba disponible con las funciones existentes previamente. Las funciones seguras y muchas de las funciones existentes ahora establecen y a menudo devuelven también un tipo de código, para proporcionar mejores informes errnoerrno de errores.

  • Filesystem security. Las API de E/S de archivo seguras admiten el acceso seguro a los archivos de forma predeterminada.

  • Windows security. Las API de proceso seguras aplican directivas de seguridad y permiten especificar ACL.

  • Format string syntax checking. Se detectan cadenas no válidas, por ejemplo, con el uso de caracteres de campo de tipo incorrecto en las cadenas de formato printf.

Vea también

Validación de parámetros
Sobrecargas de plantilla seguras
Archivos de tiempo de ejecución de C (CRT) y biblioteca estándar de C++ (STL)