编程人员在编程过程中应加强安全意识,建立攻击者思维,养成安全编码的习惯,编写出安全可靠的代码。
1.攻击者思维
编程过程中应该时刻保持以下的假设:
1. 程序所处理的所有外部数据都是不可信的攻击数据;
2. 攻击者时刻试图监听、篡改、破坏程序运行环境、外部数据。
2.安全编码基本思想
基于以上的假设,得出安全编码基本思想:
1. 程序在处理外部数据时必须经过严格的合法性校验。编程人员在处理外部数据过程中必须时刻保持这种思维意识,不能做出任何外部数据符合预期的假设,外部数据必须经过严格判断后才能使用。编码人员必须在这种严酷的攻击环境下通过遵守这一原则保证程序的执行过程符合预期结果。
2. 尽量减少代码的攻击面。代码的实现应该尽量简单,避免与外部环境做多余的数据交互,过多的攻击面增加了被攻击的概率,尽量避免将程序内部的数据处理过程暴露到外部环境。
3. 通过防御性的编码策略来弥补潜在的编码人员的疏忽。粗心是人类的天性。由于外部环境的不确定性,以及编码人员的经验、习惯的差异,代码的执行过程很难达到完全符合预期设想的情况。因此在编码过程中必须采取防御性的策略,尽量缓解由于编码人员疏忽导致的缺陷。这些措施包括:
1)变量声明应该赋予初值
2)谨慎使用全局变量
3)禁用功能复杂、易用错的函数
4)禁用易用错的编译器/操作系统的机制
5)小心处理资源访问过程
6)不要改变操作系统的运行环境(创建临时文件、修改环境变量、创建进程等)
7)严格的错误处理
8)合理使用调试断言(ASSERT)
上文提到编码时,不要信任外部数据符合预期,那何为外部数据?
拓展:外部数据定义
1)文件(包括程序的配置文件)
2)注册表
3)网络
4)环境变量
5)命令行
6)用户输入(包括命令行、界面)
7)用户态数据(对于内核程序)
8)进程间通信(包括管道、消息、共享内存、socket、RPC等)
9)函数参数(对于API)
10)全局变量(在本函数内,其他线程会修改全局变量)
参考:gitcode社区-开源文档-菊厂C编程规范