输入是一个很广泛的概念,既是用户和软件之间的交互手段,也是软件内部模块之间的交互手段。针对软件用户的输入有很多类型,如:
●用户在软件上输入一个命令,进行相应操作。
●用户输入自己的账号密码,进行登录验证。
●用户输入一个关键字,进行查询等。
模块之间进行数据传递时,也会有相应输入,如:
●一个模块调用另一个模块时,输入一些参数。
●一个模块读取一个配置文件来对自己的行为进行配置等。
从程序本身的角度讲,很多情况下,软件的安全问题就出在输入;从攻击者的角度讲,输入是进行攻击的重要手段。经过调查总结,大部分的软件安全问题来源于应用程序接收输入数据前,没有进行安全性验证。
在对输入进行检查时,为了保证实际工作的可行性,在设计时,可以采用以下几种策略:
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语句。
●秘密调用函数和存储过程。
在有些数据库产品中允许一次性运行多条语句,这给攻击者留下了更大的攻击空间。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。