C++ 安全性最佳做法

本主题包含关于推荐的安全工具和做法的信息。使用这些资源和工具并不会使应用程序免受攻击,但能降低攻击得逞的可能性。

Visual C++ 安全功能

本节讨论内置于 Visual C++ 编译器和链接器中的安全功能。

  • /GS(缓冲区安全检查)
    此编译器选项指示编译器将溢出检测代码插入到面临被利用风险的函数中。当检测到溢出时,将停止执行。默认情况下,此选项处于打开状态。

  • /SAFESEH(图像具有安全异常处理程序)
    此链接器选项指示链接器在输出映像中包括一张包含每个异常处理程序的地址的表。在运行时,操作系统使用此表来确保只执行合法的异常处理程序。这有助于防止在运行时执行由恶意攻击引入的异常处理程序。默认情况下关闭此选项。

  • /NXCOMPAT , /NXCOMPAT(与数据执行保护兼容)
    这些编译器和链接器选项实现了数据执行保护 (DEP)的 兼容性。DEP 可防止 CPU 执行非代码页。

  • /analyze(代码分析)
    此编译器选项激活代码分析,以报告潜在的安全问题,例如缓冲区溢出、未初始化的内存、null 指针取消引用和内存泄漏等。默认情况下关闭此选项。有关详细信息,请参阅C/C++ 代码分析概述

  • /DYNAMICBASE(使用地址空间布局随机化功能)
    通过使用此链接器选项,可以使一个可执行映像在执行开始时在内存的不同位置加载生成。此选项还可使堆栈在内存中的位置更加不容易预测。

增强了安全性的 CRT

C运行时库(CRT)已将存在安全风险的函数扩展到包含安全版本的函数——如,非检查strcpy字符串拷贝函数.这些函数的早期、不安全版本现已被弃用,因此使用它们将导致编译时警告。强烈建议您使用这些 CRT 函数的安全版本,而不是选择取消显示编译警告。有关详细信息,请参阅CRT 中的安全功能

SafeInt 库

SafeInt 库有助于防止整数溢出以及在应用程序执行数学运算时可能导致的其他可被人利用的错误。SafeInt 库包括 SafeInt 类SafeIntException 类和若干 SafeInt 函数

SafeInt 类可防止整数溢出和被零除漏洞。您可以使用它处理不同的类型之间的值的句柄比较。我提供了两个错误处理策略。默认策略针对 SafeInt 类,用于引发 SafeIntException 类异常,以便报告无法完成数学运算的原因。 第二个策略针对 SafeInt 类,用于中止程序执行。还可以定义自定义策略。

每个 SafeInt 函数保护一个数学运算以避免出现可被人利用的错误。你可使用两种不同类型的参数,而不必将它们转换为相同类型。使用 SafeInt 类可保护多个数学运算。

经过检查的迭代器

经过检查的迭代器强制实施容器边界。默认情况下,当经过检查的迭代器位于边界外时,它会生成一个异常并结束程序的执行。经过检查的迭代器还提供其他级别的响应,这些响应将根据分配给预处理器定义的值(例如 _SECURE_SCL_THROWS_ITERATOR_DEBUG_LEVEL)而定。 例如,对于 _ITERATOR_DEBUG_LEVEL=2 的情况,经过检查的迭代器在调试模式中提供全面的正确性检查,这些检查可通过使用断言来实现。有关详细信息,请参阅经过检查的迭代器

托管代码的代码分析

托管代码的代码分析,又称 FxCop,检查程序集与 Microsoft .NET Framework 的设计准则是否一致性。FxCop 分析各个程序集内的代码和元数据以检查下列领域中的缺陷:

  • 库设计

  • 本地化

  • 命名约定

  • 性能

  • 安全性

Windows 应用程序验证工具

应用程序验证工具 (AppVerifier) 可帮助您识别潜在的应用程序的兼容性、稳定性和安全问题。

AppVerifier 可监视应用程序如何使用操作系统。在应用程序运行的过程中,此工具会监视文件系统、注册表、内存和 API,并针对它发现的问题给出有关如何在源代码级进行修复的建议。

你可以使用 AppVerifier :

  • 检测由常见编程错误导致的潜在的应用程序兼容性错误。

  • 检查应用程序是否有与内存相关的问题。

  • 标识应用程序中潜在的安全问题。

AppVerifier 是应用程序兼容性工具包中的一个部件,在 TechNet 网站的应用程序兼容性 中可得到.

.NET Framework 安全功能

Configuring Security Policy介绍了用于调整 .NET Framework 安全策略的准则和工具。

Windows 用户帐户

使用属于 Administrators 组的 Windows 用户帐户使开发人员和最终涉及到的客户暴露在安全风险下。有关更多信息,请参见作为用户组的成员运行用户帐户控制 (UAC) 如何影响应用程序

请参见

参考

System.Security

概念

用户帐户控制 (UAC) 如何影响应用程序

其他资源

.NET Framework 中的安全性