首页 理论教育 如何确保输入数据安全?

如何确保输入数据安全?

时间:2023-06-09 理论教育 版权反馈
【摘要】:经过调查总结,大部分的软件安全问题来源于应用程序接收输入数据前,没有进行安全性验证。3)严格检查不可信的输入。

如何确保输入数据安全?

输入是一个很广泛的概念,既是用户和软件之间的交互手段,也是软件内部模块之间的交互手段。针对软件用户的输入有很多类型,如:

●用户在软件上输入一个命令,进行相应操作。

●用户输入自己的账号密码,进行登录验证。

●用户输入一个关键字,进行查询等。

模块之间进行数据传递时,也会有相应输入,如:

●一个模块调用另一个模块时,输入一些参数。

●一个模块读取一个配置文件来对自己的行为进行配置等。

从程序本身的角度讲,很多情况下,软件的安全问题就出在输入;从攻击者的角度讲,输入是进行攻击的重要手段。经过调查总结,大部分的软件安全问题来源于应用程序接收输入数据前,没有进行安全性验证。

在对输入进行检查时,为了保证实际工作的可行性,在设计时,可以采用以下几种策略:

1)尽量让程序可以输入的入口少一些。这样的话,如果程序分为若干个模块,那么攻击者直接和某些模块通信的概率大大减小。

2)尽量减少允许的输入类型。这样可以让验证的工作更加简化。

3)严格检查不可信的输入。不仅在数据最初进入程序时要执行检查,而且在程序实际使用这些数据时,也要进行检查。

4)转变观念,从定义“非法”到定义“合法”。定义“什么是非法”,容易想到,但是无法定义全;而定义“什么是合法”,就相对容易得多。

1.数字输入安全

数字的输入安全,是比较常见的。例如,在表单上输入一个人的年龄,一般就会有范围限制。对数字的安全检查主要包括:

●格式。如整数、小数等。

●精度。如小数保留的位数等。

●范围。如某个输入数字的大小取值范围等。

●类型和范围的匹配。如为了预防整数溢出,对短整数的输入进行范围检查等。

针对数字输入的安全要注意以下几点:

1)对数字格式进行确定。例如,有的系统中数字是阿拉伯数字,也有的系统支持中文数字(如一、二、三,甚至壹、贰等)输入,有的系统中数字每三位就有一个“,”。一般情况下,可以用正则表达式来验证字符串是否是数字,然后进行数字的安全检查。

2)对于负数的验证。一般最好不要根据有没有符号位来确定该数是不是负数。因为有些程序中,如果输入一个很大的正数,就可能导致数值“溢出”而变成一个负数,所以要进行一些底层的判断。

3)特别要注意判断数值溢出(如整数溢出)的问题。

2.字符串输入安全(www.xing528.com)

根据前面介绍的原则,一般情况下,要确定合法的字符串,拒绝所有其他字符串,而不是确定非法的字符串,接受所有其他字符串。

同样,指定合法字符串最简单的方法是使用正则表达式,这种情况下,只需要正确使用正则表达式,描述合法字符串的模式,判断输入的字符串是否符合这个模式,并拒绝不符合这个模式的数据。

关于对字符串的验证,有以下问题值得注意:

1)如果使用正则表达式,最好明确地指出要匹配数据的开始(通常用^来标识)和结束(通常用$来标识),否则,攻击者可能在输入中嵌入攻击文本,并且能够绕过安全检查。

2)尽可能在输入中拒绝特殊字符。因为有很多特殊字符在某些系统下拥有特殊的含义,如\,在Windows操作系统中可能作为文件路径分隔符

3.文件名安全

在很多与文件输出有关的系统中,文件名有可能成为安全隐患。无论在什么样的操作系统中,文件名应该遵循以下安全准则

1)最好不要让用户来自己输入文件名,应该在界面上给用户一个默认的文件名。如Windows操作系统中将文件另存时,界面中“文件名”框中,会显示一个默认的合法名称,避免不合法的文件名造成安全问题。

2)如果不得不让用户输入文件名,那么最好将文件名限制为只能含有字母和数字。特别应该考虑将一些特殊字符,如/、\、-、.和通配符(如*、?、[]和{})等,从合法模式中去掉。

3)不要允许用户命名一些可能和物理设备冲突的文件名。例如,在一些系统中,一些文件名可以被认为是物理设备。例如,如果一个程序试图打开COM1文件,可能被系统误解为是尝试与串口通信,此时系统就可能去进行串口的读/写。

4.数据库输入安全

攻击者通过对数据库的恶意输入,可以将信息注入正在运行的流程,获取敏感数据,甚至危害进程的运行状态。

如以下常见代码:

变量name由用户提供。这个SQL语句看上去没有问题,如果用户的输入为name=ligang,则它将创建完整、良好的SQL语句:

SELECT*FROMT_CUSTOMER WHERE NAME='ligang'

但是这可能会给用户恶意输入的机会。该SQL语句的问题在于攻击者可在变量name中植入SQL语句。如果用户的输入为:ligang'OR1=1--,则语句变为

SELECT*FROMT_CUSTOMER WHERE NAME='ligang'OR1=1--'

这条语句将返回表T_CUSTOMER列NAME值为ligang的行,或者所有满足1=1子句的行。而对于表中的每一行,1=1都返回true,因此表中的所有行都将被返回,此种情况下,攻击者将能够获得表T_CUSTOMER中的所有数据。

攻击者通过这种技术,可以完成以下攻击活动:

●改变一条SQL语句的具体条件。

●添加并且运行额外的SQL语句。

●秘密调用函数和存储过程。

在有些数据库产品中允许一次性运行多条语句,这给攻击者留下了更大的攻击空间。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈