不安全的语言:C语言

前端时间,开源安全公司WhiteSource对编程语言安全性进行了分析,揭示了哪些语言存在最多的安全漏洞,C语言占据不安全的语言榜首。下面简单谈谈自己对C语言不安全原因的认识,参考了网上的一些博客内容。

1. 数据封装性差

C语言是面向过程而不面向对象的,因此数据封装性差,数据安全性低。

2. 指针的不安全性

C语言中的指针是其精髓所在,使用指针可以直接访问物理地址,直接靠近硬件操作,这一点使其操作强大但同时也带来了不安全性。
靠近硬件的操作使得它既具有高级语言的功能,又具有低级语言的许多功能,能够像汇编语言一样对位(bit)、字节和地址进行操作,而这三者是计算机最基本的工作单元,可用来写系统软件。但是C的指针操作不做保护,这样的粗暴手段会把安全因素破坏掉从而获得本来不应该获得的东西。比如常见的溢出和越界错误,就是C程序侵犯操作系统的保护领域时被踢出的表现。
C++在这方面做了改进,在保留了指针操作的同时又增强了安全性,受到了一些用户的支持,但是,由于这些改进增加语言的复杂度,也为另一部分所诟病。Java则吸取了C++的教训,取消了指针操作。

3. 语法限制不严格

虽然C语言也是强类型语言,但它的语法比较灵活,允许程序编写者有较大的自由度,这一点也影响了程序的不安全性。比如C不能够自动做边界检查,这在一定程度上提高了效率,但同时带来了安全隐患。以下是C中几个典型的不安全库函数:

(1)Strcpy()函数

将源字符串复制到缓冲区,但没有指定要复制字符的具体数目,如果源字符串碰巧来自用户输入,且没有专门限制其大小,则有可能会造成缓冲区溢出。
一种解决方式是使用strncpy来完成同样的目的:
strncpy (dst, src, dst_size-1);
如果 src 比 dst 长,则该函数不会抛出一个错误;当达到最大尺寸时,它会停止复制字符。但需要注意的是该函数也不完全安全,注意上面调用 strncpy() 中的 -1,如果 src 比 dst 长,则那给我们留有空间将一个空字符放在 dst 数组的末尾,否则可能会留下未终止的字符串。
另一种方式是,在需要它时就分配空间,确保通过在源字符串上调用 strlen() 来分配足够的空间。

(2)strcat() 函数

非常类似于 strcpy(),除了它可以将一个字符串合并到缓冲区末尾。它也有一个类似的、更安全的替代方法 strncat()。如果可能,使用 strncat() 而不要使用 strcat()。

(3)sprintf() 和 vsprintf()

这两个函数是用来格式化文本和将其存入缓冲区的通用函数。它们可以用直接的方式模仿 strcpy() 行为。换句话说,使用 sprintf() 和 vsprintf() 与使用 strcpy() 一样,都很容易对程序造成缓冲区溢出。
sprintf() 的许多版本带有使用这种函数的更安全的方法。可以指定格式字符串本身每个自变量的精度。sprintf 采用” * ”来占用一个本来需要一个指定宽度或精度的常数数字的位置,而实际的宽度或精度就可以和其它被打印的变量一样被提供出来。

(4)gets()

该函数从标准输入读入用户输入的一行文本,它在遇到 EOF 字符或换行字符之前,不会停止读入文本。也就是:gets() 根本不执行边界检查。因此,使用 gets() 总是有可能使任何缓冲区溢出。
作为一个替代方法,可以使用方法 fgets()。它可以做与 gets() 所做的同样的事情,但它接受用来限制读入字符数目的大小参数,因此,提供了一种防止缓冲区溢出的方法。

(5)getchar()、fgetc()、getc()、read()

如果在循环中使用这些函数,确保检查缓冲区边界。

(6)scanf()系列 : sscanf()、fscanf()、vfscanf()、vscanf()、vsscanf()

scanf系列的函数也设计得很差,目的缓冲区也可能会发生溢出。
同样地,我们用设置宽度也可以解决这个问题。

(7)getenv()

使用系统调用 getenv() 的最大问题是您从来不能假定特殊环境变量是任何特定长度的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dawn2dusk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值