我开始学习有关安全性和安全编程的所有知识 .
我一直听说过缓冲区溢出漏洞等问题 .
但我还不知道这些漏洞是如何被利用的 . 我们如何安全地编程以确保我们的代码是健壮的 .
当我说这一切时,我感兴趣的编程语言是c和c .
-
我正在寻找互联网上的免费教程和资源,在那里我可以学习安全编程的每一个内容 .
-
也欢迎平台特定提示 . 例如,我知道在Windows编程中我们可以使用像“memmove_s”这样的函数来获得安全代码 . 但Linux / Unix中的等价物是什么?或者它是一样的吗?
-
c / c程序员是否应该担心特制的格式化蜇(比如非常流行的旧PHP格式的字符串外观)?
这里有很多问题,但一般的想法是我的意思是学习安全编程 .
感谢您的帮助 .
4 回答
我会抛出一些并制作这个社区维基:
永远不会使用
gets
.不要假设字符串是空终止的,除非你真的知道它是 .
永远不要只声明一个大的固定大小的缓冲区,只是假设它对你正在做的事情“足够大” .
看看CERT C Secure Coding Standard&CERT C++ Secure Coding Standard .
断言,断言,断言 . 如果甚至存在某些可能不正确的理论可能性,请继续并断言它是正确的 . 如果某些事情与您的预期不符,您希望您的程序立即死亡并且非常壮观 . 确保您的断言不会被优化掉 .
对缓冲区要非常小心 . 有一些函数(例如gets)写入缓冲区而不知道它有多大 . 不要使用这些功能 . 始终在您需要的位置检查缓冲区大小,而不是依赖于预先计算的值 .
始终检查返回代码 . 如果你不能对错误做任何有意义的事情(例如malloc),那么断言成功,或者更好,编写一个断言成功的包装函数,这样它就不会返回错误值而永远不会使用原始函数 . 要超偏执,如果隐式忽略返回值,请让编译器发出警告 .
将进入程序的任何数据视为可能的恶意攻击,因为它是 . 这包括配置文件以及用户输入 .
“过早优化是万恶之源” . 首先要做对 . 甚至不要考虑让它更快,除非a)你绝对必须和b)你已经分析了代码并准确知道你的瓶颈是什么 .
让其他人检查您的代码 .
这些只是少数几个起点 . 编写安全代码很难 .
安全编程包含减少代码维护者自己滥用的可能性的实践 .
这是我的两分钱 - 尽可能避免使用指针 . 在我看来,只有当NULL值具有特殊含义时才应使用指针 . 这个原则延续到几个编码习语
使用STL向量而不是数组
将基本类型传递给函数时,使用pass-by-reference / pass-by-value
将用户定义的类型传递给函数时使用pass-by-const-reference . 这与传递指针一样有效 .
最重要的是,如果涉及到指针,很有可能会被最终继承代码的人滥用 .