APP下载

C语言教学实践应重视的输入安全性问题

2014-04-29吴佳芬李曙光

电脑迷 2014年15期
关键词:输入C语言安全性

吴佳芬 李曙光

摘 要 本文提出了在C语言教学实践中应重视教导学生编写可靠的程序,特别要强调程序的输入安全性处理。并针对相关问题展开了具体的讨论,指出教学中的关键点。

关键词 C语言 教学 实践 输入 安全性

中图分类号:G64文献标识码:A

0背景

当前计算机系统安全性问题受到了空前的重视,重要原因是互联网的广泛应用使不知身在何处的人都可能把信息送到我们的计算机里去。随着近年移动互联网、物联网技术的飞速发展,系统安全、信息安全等问题又面临了新的挑战。归根溯源,目前广泛使用的系统和应用软件中存在大量安全性缺陷,计算机基础教学中缺乏对学习者在安全性方面知识和规范的教育可能难辞其咎。

我们希望从学生开始学习程序设计时就特别关注程序安全性问题,在教学中不断出现对安全性问题的讨论,提高学生的编写健壮性好、安全性高的程序的意识和能力。

1正确与可靠

我们要求学生编写正确的程序,这是C语言教学最基本的要求。但什么是正确的程序呢?针对一个具体问题写出的一段程序或是一个函数的正确与否,可以设法给出严格的定义,这种定义可以是一个具有数学意义的严格性定义,程序理论研究者在这方面已经做了很多工作。本文并不讨论严格的定义,主要借助以下直观观察:(1)一个C函数从参数计算出返回值的过程,即从输入到输出。(2)一个与外部交互的程序从输入的数据计算出输出数据的过程。

但是,函数和程序通常不是对所有输入都能计算出输出的。例如求平方根的函数,它只能对非负的double类型的数值计算出结果。又如,C编译程序只能对满足C语言语法的字符串生成目标代码。参考上述情况,对程序的正确性可以有如下认识:(1)一个C函数对满足要求的参数计算出正确的返回值。(2)一个与外部交互的程序,对满足要求的输入数据都能计算出正确的输出。

2遇到不正确输入时的行为

考虑这样的情况:如果写了一个程序,该程序对形式合适的数据都能正确的计算并输出其平均值,这个程序完成了所需工作,那么可以认为该程序是正确的。现在假设输入的数据有错,例如文件里出现了不能转换为数值的字符或字符序列,这时程序已不能“正常”完成工作了,那么这个程序可能出现的行为有:

(1)报告被处理数据有错,输出正常输入数据的平均值后结束;

(2)报告数据有错,丢掉非数字字符后继续处理,直至读入所有数据并输出得到正确数据的平均值后结束;

(3)报告数据有错后立即结束;

(4)没有任何报告,产生输出后结束;

(5)不产生任何输出就立即结束;

(6)陷入无限循环,既不报告数据有错误也不结束;

(7)进入不明状态,胡乱修改内存甚至破坏其他正在运行的程序,或破坏计算机内存或外存里的数据后结束或不结束。

对用户而言,前三种情况比较容易接受。第4种情况容易给人造成假象和误解。第5、6两种情况会让人感到莫名其妙。最后的情况则非常可怕。实际程序中常常会遇到不合需要的输入,任何实用的程序,都必须考虑对错误输入的恰当处理。设计程序时要确定恰当的原则并始终如一的贯彻。处理的原则可能与应用有关,但也有一般性的原则。例如:(1)保证任何错误输入不破坏本程序自身,不将程序带入无法预知的状态。对上例,就是避免最后两种情况的产生。(2)保证程序对任何输入都有合理反应,必要时给用户提供适当的报告。上例中的前三种处理方式都有报告。(3)尽可能恢复到能继续工作的状态。上例中的第2种情况。

可见,设计和实现交互式程序时,必须合理处置错误输入。不但要使程序保证对正确输入能正确工作,还需要保证它遇到不正确输入时具有可保证的合理行为。没有这方面保证的程序或系统是有问题的。

3输入与安全性

程序安全性的一个大问题就是程序输入的处理。第一,输入是不受编写程序的人控制的;第二,已经写好的程序可能遇到各种各样不满足需要的输入;第三,在遇到不满足需要的输入时应该如何处理,常常出现很难权衡的设计选择。

合理地处理不合要求的输入,第一个条件是检查输入。要帮助学生明白这样几点:第一,从理论上说,程序的每个输入都应该仔细检查,确定其是否满足程序的需要。第二,只有满足需要的输入才能送给后续处理阶段。第三,要了解处理不正确输入时的各方面考虑。

C语言标准函数库的输入函数的输入机制本身就是有安全性缺陷的。例如,gets函数没有输入长度限制,因此完全不应该使用而应该用fgets函数来代替;又如,scanf输入函数的%s转换描述不安全,使用时必须加上域长度限制,如%256s等。在使用C语言的输入函数时,应该检查其返回值,了解输入工作完成的情况,理解如何在输入未能正常完成的情况并且做出合理的处理。

目前讨论较多的输入问题有两个:(1)缓冲区溢出:通过馈入超长字符序列的方式造成程序的输入缓冲区溢出,从而将某些信息写入系统内存中不应使用的位置,藉此造成进一步破坏的可能性。(2)整数溢出:输入的整数有时不是简单地作为程序里的数据,而是用于做其他事情。例如确定内存分配的大小,非合法范围的整数就可能导致系统垮台,或者导致外部取得对程序的控制。

4结语

由于C语言不做运行时检查,因此可能导致程序运行时出现的错误没有报告,典型的情况有:数组越界访问、空指针或不合法指针的间接访问、联合变量的不正确使用等等。在教学的过程中,这些问题都值得向学生提出并加以讨论。每个程序设计的学习者,都可能对未来计算机系统的安全运行和社会安全产生影响,因此,作为C语言教学工作的承担者对此负有重大责任。

猜你喜欢

输入C语言安全性
新染料可提高电动汽车安全性
某既有隔震建筑检测与安全性鉴定
基于Visual Studio Code的C语言程序设计实践教学探索
基于C语言的计算机软件编程
高职高专院校C语言程序设计教学改革探索
“四环节”下的牛津英语课堂模式
浅议习得理论下初中英语教学的策略调整
高中英语阅读与写作有效结合
ApplePay横空出世 安全性遭受质疑 拿什么保护你,我的苹果支付?
论子函数在C语言数据格式输出中的应用