C++安全编码概念及定义

C++安全编码

目的

建立编程人员的攻击者思维,养成安全编码的习惯,编写出安全可靠的代码。

攻击者思维

编程中应该时刻保持如下假设:

  1. 程序处理的所有外部数据都是不可信的攻击数据。
  2. 攻击者时刻试图监听、篡改、破坏程序运行环境、外部数据。

安全编码基本思想

基于以上假设,得出安全编码基本思想:

  1. 程序在处理外部数据时必须经过严格的合法性校验:处理外部数据时,不能做出任何外部数据符合预期的假设,外部数据必须严格判断后才能使用。
  2. 尽量减少代码的攻击面:代码实现应该尽量简单,避免与外部环境做多余的数据交互,过多的攻击面增加了被攻击的概率,尽量避免将程序内部的数据处理过程暴露到外部环境。
  3. 通过防御性的编码策略来弥补潜在的编码人员的疏忽:由于外部环境的不确定,编码人员的经验、习惯差异,代码的执行过程很难达到完全符合预期。编码过程中采取防御性的策略,尽量缓解由于编码人员疏忽导致的缺陷。措施包括:
    • 变量声明应该赋予初值
    • 谨慎使用全局变量
    • 禁用功能复杂、易用错函数
    • 禁用易用错的编译器/操作系统的机制
    • 小心处理资源访问过程
    • 不要改变操作系统的运行环境(创建临时文件、修改环境变量、创建进程等)
    • 严格的错误处理
    • 合理使用调试断言(ASSERT)

外部数据定义

  • 文件(包括程序的配置文件)
  • 注册表
  • 网络
  • 环境变量
  • 命令行
  • 用户输入(命令行、界面)
  • 用户态数据(对于内核程序)
  • 进程间通信(包括管道、消息、共享内存、socket、RPC等)
  • 函数参数(对于API)
  • 全局变量(本函数内,其他线程会修改全局变量)

总结

编码时,保持安全的思想,使编写出的程序更加强壮;有了安全的思想,剩下就是采用手段进行武装;后续的文章对安全编码的规则进行一一分析和解释。

©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页