事情的结局强如事情的起头;耐心胜过骄傲。 | |
传道书 7:8 (NIV) |
在类似 Unix 的系统(如 Linux 和 Unix)上,设计和实现真正安全的程序实际上是一项艰巨的任务。困难在于,真正安全的程序必须对潜在恶意用户控制的所有可能的输入和环境做出适当的响应。安全程序的开发人员必须深入了解他们的平台,寻求并使用指南(如本文档),然后使用保证流程(如检查和其他同行评审技术)来减少他们程序的漏洞。
总之,以下是本书中的一些关键指南:
验证所有输入,包括命令行输入、环境变量、CGI 输入等等。不要只是拒绝“坏”输入;定义什么是“可接受”的输入,并拒绝任何不匹配的内容。
避免缓冲区溢出。确保长输入(和长中间数据值)不能用于接管你的程序。这是目前主要的程序性错误。
构建程序内部结构。保护接口安全,最小化权限,使初始配置和默认设置安全,并实现故障安全。避免竞争条件(例如,通过安全地打开共享目录(如 /tmp)中的任何文件)。只信任可信的渠道(例如,大多数服务器不得信任其客户端进行安全检查或其他敏感数据,例如购买商品的价格)。
谨慎调用其他资源。将其值限制为有效值(尤其要注意元字符),并检查所有系统调用返回值。
审慎地回复信息。特别是,尽量减少反馈,并处理对不可信用户的完整或无响应输出。