让我们来看一些您必须要融入到您的C/C++应用程序开发过程的重要应用安全最佳实践。谨记 — 您需要防御所有可能危害系统的方式,因为攻击者只需找到一个被忽视的区域就可能实现攻击。
攻击面减少原则声明在您部署您的产品应用程序时,您需要仅启用正确操作所需功能,而禁用其它特性。这样可以减少需要防御的区域数量,并且简化您的安全任务。
安全缺省原则声明了您需要使用最安全的缺省设置来部署应用程序。用户通常不了解某些特性,并且不会根据最安全的设置来对其进行配置。以安全缺省来部署应用程序会降低攻击者利用用户保留的不安全设置的可能性,还可以减小应用程序的攻击面。
最小权限原则声明为了降低潜在利用造成的影响,您使用应用程序正确运作所需最小权限来部署您的应用程序。您可以在必要时提升权限,在不需要时释放已提升的权限。
纵深防御原则是基于这样的假设,及在某些情况下,任何防御都可能失败。因此,您需要联合部署多层防御与最佳实践,从而形成一个全面的防御策略。通过此方法,如果一层防御失败,那么其它层的防御会继续保护您的应用程序,降低成功攻击的可能性。
数据分离原则意味着您从应用程序代码中分离数据。这可以帮助您防止不可信代码被您的应用程序执行。例如,在缓冲区溢出中,恶意可执行代码通常被传递给函数,而不是数据。默认情况下,C/C++应用程序不会区分代码与数据,所以您需要采取一切预防措施来防止恶意代码被作为数据传递,并被执行。
让我们来深入研究一下输入验证,任何应用安全策略的关键组成部分。输入验证会在输入被应用程序使用前验证该输入的格式为正确、安全的。如果正确实施,其将是缓解几乎每个已知应用程序漏洞带来的风险的最有效方法。
让我们来回顾一些基本输入验证原则。
您的应用程序可能接收来自于多种资源的不可信输入,包括用户与不同应用程序组件。请将所有输入视为不可信的,并验证所有输入。
输入验证的两种主要方法是白名单与黑名单验证。白名单允许已知良好的输入,并拒绝所有其它输入。其可以强有力的验证输入的类型、范围、格式与长度。
黑名单仅拒绝已知不良的输入,而允许其它所有输入。其内在缺陷在于所有不良输入组可能是无限的,并且无法完全被阻止。因此,您应该总是使用白名单验证,而仅将黑名单作为一种补充措施使用。
始终根据您应用程序的需求定制实施输入验证。输入验证是复杂的,因为输入的类型与结构,例如名称、日期与地址,在不同应用程序之间可能有很大差异。
如果您的应用程序使用客户端-服务器架构,那么请始终在服务器端执行验证。客户端是易受攻击的,并且可被攻击者绕过或操纵。您仍然可以将其作为一种补充安全措施在客户端验证其性能。如果输入通过了客户端与服务器端验证检测,那么其可能是安全的。如果其仅通过了客户端检测,而没有通过服务器端,那么这可能是一个攻击的迹象。
本文由端玛科技有限公司编写整理,转载请说明出处。
端玛科技是专门从事于应用软件安全风险评估、风险消除、培训、教育和软件安全生命开发周期SDL咨询的软件安全公司,关注我们,学习更多应用安全相关知识。