为了防止在程序里产生各种安全漏洞,程序员需要遵循一些必要的安全编码规则:
1,对输入参数进行严格检查,尤其严格检查缓存长度。
需要严格判断函数输入参数的合法性,我们称之为:严进宽出。具体点说,就是要判断函数参数中的指针是否为NULL,函数参数中缓存的长度是否在合理范围。这一点非常的重要。
比如同样对于下面函数原型,那么我们就需要作出如下的判断:
void reverse_str(char *str, size_t len)
{
/*首先判断str指针是否为NULL或者len是否为0和1,这些都是特殊情况或者非法输入,因此要严格检查,严进宽出。*/
if(str== NULL || *str=='\0'||
len==0 || len==1)
{
return;
}
//程序如果执行到这里,那么参数检测就完成了并合法了。因此可以继续完成相应的功能了。
......
}
严进宽出是写程序的一个非常好的习惯,可以避免程序在运行中出错,甚至避免各种严重漏洞的产生。比如曾经十分严重的SSL协议中的心脏流血漏洞,就是因为服务端程序在处理的时候,没有验证来自客户端对应的缓存长度的有效性,而造成了该漏洞的产生。
2,禁用淘汰的字符串操作函数,比如strcpy(),strcat(),sprintf()等函数,而使用更新版本的字符串和内存操作函数:strcpy_s、strcat_s
StringCbxxx/StringCchxxx,strncpy()等。
3,主动开启操作系统提供的各种安全机制。
这些操作系统提供的安全机制包括:Security Cookie(gs)机制,SafeSEH机制,DEP数据执行保护机制,ASLR地址随机化机制,堆保护机制,safeunlink,
heap-cookie等各种机制,这些机制使得基于缓冲区溢出的攻击难度大大提高,有效的降低了攻击风险。
Copyright 2011-2020 © MallocFree. All rights reserved.