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,检查程序集指定了 .NET framework 设计准则。 FxCop 分析代码和元数据在每个程序集检查 bug 在以下方面:

  • 库设计

  • 本地化

  • 命名约定

  • 性能

  • 安全性

Windows 应用程序验证工具

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

AppVerifier 可监视应用程序如何使用操作系统。 会监视文件系统、寄存器表、内存和 API,当应用程序运行期间,并针对源代码解决为它发现的问题。

可以使用 AppVerifier:

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

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

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

AppVerifier 是应用程序兼容性工具包的一部分,以 应用程序兼容性 防止 TechNet 网站中可用。

.NET Framework 安全功能

Configuring Security Policy 介绍有关和工具调整 .NET framework 安全策略。

Windows 用户帐户

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

请参见

参考

System.Security

概念

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

其他资源

.NET Framework 中的安全性