安全函数

http://bbs.csdn.net/topics/320093308


发表于: 2009-10-14 20:55:08
大家使用VS2005和VS2008编程时,很多的初学者都会遇到这样的困惑——明明是C语言课本上的gets、scanf函数,为什么编译器会给出不安全警告呢?

大家如果细心,会发现微软每月更新的漏洞补丁的描述几年来发生了微妙的变化,几年前,大多数补丁都是由于缓冲区溢出漏洞造成的,微软痛定思痛,在Vista的开发中禁止使用了一切不安全库函数,因此,现在的Windows漏洞,尤其是Vista的,基本上没有所谓的缓冲区溢出漏洞了。

微软给出警告的(还有很多函数没有给警告,但不代表安全)那些不安全函数,大多是有潜在缓冲区溢出漏洞的,那么是不是都应该像编译器所推荐的使用_s版本或者像Windows核心编程力推荐的那样使用shlwapi.h里定义的安全API呢?

不一定,有些安全漏洞是可以通过简单的逻辑控制消避免的,而且完全使用“微软推荐”的话也就中了微软的计——上面提到的安全函数只有VC里面有!呵呵,我想比较资深的Windows用户大多对Windows系统设置里的微软推荐不屑一顾吧,这里也是这个道理,商业公司的推荐那是广告、或有商业目的的,不可全信。

该如何做呢,给大家一些建议。

屏幕输入:gets和scanf等输入函数的缓冲区溢出漏洞不在于程序本身,而在于用户输入,因此,没有什么简单的办法能避免漏洞的出现,除非你自己写代码监视标准输入,一定长度后截断,如果这样,还不如直接用gets_s、scanf_s,用户输入时速度瓶颈是用户操作,所以无所谓安全版本慢了20%。

字符串、内存赋值:strcpy、strcat、wcscpy、wcscat、memcpy、memset这些库函数,lstrcpy、lstrcat这些API,由于没有越界检查,目标字符串可能越界。很多人推荐strncpy之类,这根本是大同小异——人们列举不安全函数的时候memcpy是必选的,那我就要问问,strncpy和memcpy除了多个类型限制,在防止缓冲区溢出方面有加强么?二者都有最大长度限制,memcpy不安全,strncpy也半斤八两。实际上strcpy和strncpy,前者把防止缓冲区溢出的任务放在了分配内存的时候——分配内存、定义数组时考虑一下字符串最大长度,防止strcpy溢出;后者把这个最大长度放在了拷贝函数里……只是在不同的地方控制而已,至少在安全性上,strncpy没有本质提高。因此,这一类函数如果使用得当,是可以避免安全漏洞的,如果安全性要求很高,应该使用string类或安全API。

格式化:典型的如sprintf,首先,与字符串操作相同,由于全是变量操作,没有用户输入的干预,简单的逻辑控制可以避免漏洞,除非安全性要求很高(比如关键系统,容不得哪怕是潜在的漏洞),否则没有一定要使用安全函数的必要,可代替的安全函数有安全API StrFormatKBSize,安全库函数sprintf_s,ATL中的CStringT::Format等,之所以不推荐使用安全版本,是因为这些安全版本里快的如sprintf_s也比sprintf慢50%,CStringT::Format要慢几十倍!格式化操作经常在循环中处理而且没有用户干扰,这个效率是不能忽视的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值