论文部分内容阅读
摘要:分析了用户输入对web程序的安全带来的威胁,提出了构建应用程序安全的对策,并介绍了几种常用的工具。
关键词:安全;用户输入;校验;攻击
中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)03-10677-02
1 引言
用户输入部分是应用程序与用户交互的窗口,一般应用程序都是通过用户输入的数据来进行操作的。一些带有恶意的用户,往往会利用用户输入部分对应用程序进行攻击。如果对用户输入的内容不进行检验的话,往往会使得恶意用户有了攻击的窗口。而大部分的安全问题都是出现在应用程序层,而不是出现在网络硬件层。因而对用户输入合法性的判断对于应用程序来说十分重要。
2 用户输入对web应用程序带来的威胁
利用用户输入的攻击方式通常有以下几种:
(1)缓冲区溢出。简单的说,缓冲区溢出是指当计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量。溢出的数据覆盖在合法数据上。程序运行的理想情况是,程序检查数据长度并且不允许输入超过缓冲区长度的字符串。事实上,由于开发者的不注意,绝大多数程序都会假设数据长度总是与所分配的存储空间相匹配,这就为缓冲区溢出埋下隐患。当一个超长的数据进入到缓冲区时,超出部分就会被写入其他缓冲区,其他缓冲区存放的可能是数据、下一条指令的指针,或者是其他程序的输出内容,这些内容都被覆盖或者破坏掉。可见一小部分数据或者一套指令的溢出就可能导致一个程序或者操作系统崩溃。缓冲区溢出是由编程错误引起的,如果缓冲区被写满,而程序没有去检查缓冲区边界,也没有停止接收数据,这时缓冲区溢出就会发生。一般情况下,覆盖其他数据区的数据是没有意义的,最多造成应用程序错误,但是,如果输入的数据是经过“黑客”或者病毒精心设计的,覆盖缓冲区的数据恰恰是“黑客”或者病毒的入侵程序代码,一旦多余字节被编译执行,黑客或者病毒就有可能为所欲为,获取系统的控制权。
(2)SQL注入。SQL注入攻击源于英文“SQL Injection Attack”。目前还没有看到一种标准的定义,常见的是对这种攻击形式、特点的描述。微软技术中心从两个方面进行了描述:一是脚本注入式的攻击。二是恶意用户输入用来影响被执行的SQL脚本。Stephen Kost给出了这种攻击形式的另一个特征:“从一个数据库获得未经授权的访问和直接检索”。SQL注入攻击就其本质而言,利用的工具是SQL的语法,针对的是应用程序开发者编程过程中的漏洞。当攻击者能够操作数据,往应用程序中插入一些SQL语句时,SQL注入攻击就发生了。由于SQL注入攻击利用的是SQL语法,使得这种攻击具有广泛性。理论上说,对于所有基于SQL语言标准的数据库软件都是有效的,包括MS SQL Server,Oracle,DB2,Sybase 等。当然,各种软件有自身的特点,最终的攻击代码可能不尽相同。SQL注入攻击的原理相对简单,易于掌握和实施,并且整个Internet上连接有数目惊人的数据库系统。归根到底,SQL注入攻击是来源于用户输入的内容。
(3)跨站脚本攻击。所谓跨站脚本漏洞其实就是Html的注入问题,恶意用户的输入没有经过严格的控制进入了数据库最终显示给来访的用户,导致可以在来访用户的浏览器里以浏览用户的身份执行HTml代码。数据流程如下:恶意用户的Html输入—>web程序—>进入数据库—>web程序—>用户浏览器。从而引起跨站脚本的攻击。
3 由用户输入带来的安全问题的解决方法
要解决用户输入带来的安全威胁,最基本的方法就是要对用户的输入进行过滤。要实验也比较容易,只要对用户输入的内容进行校验就可以。用户输入校验成本低,但对应用程序的安全带来了很大的保障。总结的方法有以下几种。
(1)设计好程序的用户界面,减少用户输入内容的威胁。有人认为,程序界面与程序的安全性没有关系。其实不然,例如:在用户输入的部分,使用textbox这种输入方式与下拉菜单相比,安全性是有区别,下拉菜单的方式对于程序的安全性来说更有保证。所以说设计一个好的用户输入界面,能够减少用户输入对程序的威胁。
(2)对用户输入的内容进行过滤或校验。这也是最重要的一点。对于用户输入的过滤主要有两类,一是filter in过滤,简单地说filter in过滤就是规定那些字符可以进入系统。就是规定好用户可以输入那些字符或字符串,例如规定用户输入只能是a到z和0到9,只有这些字符才是合法的才能进入系统,其他的字符不能进入系统。二是filter out过滤,就是指那些字符不可以进入系统。例如规定 #&*- 这些字符不能进入系统,就是对用户输入的内容进行检测,遇到规定的字符就认为是非法的输入。而对于用户输入内容的检验,是检查用户输入的字符串模式是否与程序要求的模式一样。
(3)程序的内部错误信息不要显示给用户。对于一般的用户而言,系统的错误信息并不重要,但对于一些别有用心、且具有丰富的攻击经验的恶意用户,他们会根据系统的错误,猜测整个系统运行的情况,从而猜测出更敏感的信息,对程序发起攻击。所以当系统出现错误的时候,不要把出错的页面显示给用户,而是把用户转到一个预先设计好的友好出错页面,给用户一个提示,说系统出错了,稍候重试之类。
4 用户输入校验的常用工具
(1)校验控件。各种开发工具都为开发者提供不同的工具。例如asp.net为开发者提供多种的校验控件。如RequiredFieldValidatot,RangValidator,RegularExpressionValidator,等。
(2)正则表达式。正则表达式是用于描述文本字符串中的模式的语言,它是通过把文本抽象成各种表达式,使用模式把字符串解析成子字符串或替换原来的文本或重新设置文本格式。例如用java实验email校验的正则表达式部分程序如下:
public class test{
public static void main(String[] args){
try{
String s = " ";
while(!s.equals("q")){
System.out.print("input:");
DataInputStream in = new DataInputStream(new BufferedInputStream(System.in));
s = in.readLine();
System.out.println("your input is :"+s);
String check = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
Pattern regex = Pattern.compile(check);
Matcher matcher = regex.matcher(s);
boolean isMatched = matcher.matches();
if(isMatched){
System.out.println("it's a email");
}else{
System.out.println("it's not a email");
}}}catch(Exception e){
System.out.println("error"+e.getMessage());}}}
(3)安全的字符串類或者库。.net中为开发者提供了安全的string类,我们在开发的过程中可以使用这些类来保障程序的安全。
5 结束语
网络时代,使得资源共享更方便,开放源码使得开发者的效率更高,但这往往也是恶意用户实验攻击的地方。对用户输入的校验能够使得我们在使用开放源码的时候,软件的安全也有保障。
参考文献:
[1]王辉,陈晓平,林邓伟. 关于跨站脚本问题的研究[J]. 计算机与设计,2004.8.
[2]龚静. 基于缓冲区溢出漏洞的攻击及防范技术探讨[J]. 湖州师范学院学报,2006.2.
[3]欧阳利军,戴术其. SQl注入入侵分析及防范[J]. 计算机与设计,2005.6.
[4]http://dev.csdn.net/article/43/43603.shtm.
本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
关键词:安全;用户输入;校验;攻击
中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)03-10677-02
1 引言
用户输入部分是应用程序与用户交互的窗口,一般应用程序都是通过用户输入的数据来进行操作的。一些带有恶意的用户,往往会利用用户输入部分对应用程序进行攻击。如果对用户输入的内容不进行检验的话,往往会使得恶意用户有了攻击的窗口。而大部分的安全问题都是出现在应用程序层,而不是出现在网络硬件层。因而对用户输入合法性的判断对于应用程序来说十分重要。
2 用户输入对web应用程序带来的威胁
利用用户输入的攻击方式通常有以下几种:
(1)缓冲区溢出。简单的说,缓冲区溢出是指当计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量。溢出的数据覆盖在合法数据上。程序运行的理想情况是,程序检查数据长度并且不允许输入超过缓冲区长度的字符串。事实上,由于开发者的不注意,绝大多数程序都会假设数据长度总是与所分配的存储空间相匹配,这就为缓冲区溢出埋下隐患。当一个超长的数据进入到缓冲区时,超出部分就会被写入其他缓冲区,其他缓冲区存放的可能是数据、下一条指令的指针,或者是其他程序的输出内容,这些内容都被覆盖或者破坏掉。可见一小部分数据或者一套指令的溢出就可能导致一个程序或者操作系统崩溃。缓冲区溢出是由编程错误引起的,如果缓冲区被写满,而程序没有去检查缓冲区边界,也没有停止接收数据,这时缓冲区溢出就会发生。一般情况下,覆盖其他数据区的数据是没有意义的,最多造成应用程序错误,但是,如果输入的数据是经过“黑客”或者病毒精心设计的,覆盖缓冲区的数据恰恰是“黑客”或者病毒的入侵程序代码,一旦多余字节被编译执行,黑客或者病毒就有可能为所欲为,获取系统的控制权。
(2)SQL注入。SQL注入攻击源于英文“SQL Injection Attack”。目前还没有看到一种标准的定义,常见的是对这种攻击形式、特点的描述。微软技术中心从两个方面进行了描述:一是脚本注入式的攻击。二是恶意用户输入用来影响被执行的SQL脚本。Stephen Kost给出了这种攻击形式的另一个特征:“从一个数据库获得未经授权的访问和直接检索”。SQL注入攻击就其本质而言,利用的工具是SQL的语法,针对的是应用程序开发者编程过程中的漏洞。当攻击者能够操作数据,往应用程序中插入一些SQL语句时,SQL注入攻击就发生了。由于SQL注入攻击利用的是SQL语法,使得这种攻击具有广泛性。理论上说,对于所有基于SQL语言标准的数据库软件都是有效的,包括MS SQL Server,Oracle,DB2,Sybase 等。当然,各种软件有自身的特点,最终的攻击代码可能不尽相同。SQL注入攻击的原理相对简单,易于掌握和实施,并且整个Internet上连接有数目惊人的数据库系统。归根到底,SQL注入攻击是来源于用户输入的内容。
(3)跨站脚本攻击。所谓跨站脚本漏洞其实就是Html的注入问题,恶意用户的输入没有经过严格的控制进入了数据库最终显示给来访的用户,导致可以在来访用户的浏览器里以浏览用户的身份执行HTml代码。数据流程如下:恶意用户的Html输入—>web程序—>进入数据库—>web程序—>用户浏览器。从而引起跨站脚本的攻击。
3 由用户输入带来的安全问题的解决方法
要解决用户输入带来的安全威胁,最基本的方法就是要对用户的输入进行过滤。要实验也比较容易,只要对用户输入的内容进行校验就可以。用户输入校验成本低,但对应用程序的安全带来了很大的保障。总结的方法有以下几种。
(1)设计好程序的用户界面,减少用户输入内容的威胁。有人认为,程序界面与程序的安全性没有关系。其实不然,例如:在用户输入的部分,使用textbox这种输入方式与下拉菜单相比,安全性是有区别,下拉菜单的方式对于程序的安全性来说更有保证。所以说设计一个好的用户输入界面,能够减少用户输入对程序的威胁。
(2)对用户输入的内容进行过滤或校验。这也是最重要的一点。对于用户输入的过滤主要有两类,一是filter in过滤,简单地说filter in过滤就是规定那些字符可以进入系统。就是规定好用户可以输入那些字符或字符串,例如规定用户输入只能是a到z和0到9,只有这些字符才是合法的才能进入系统,其他的字符不能进入系统。二是filter out过滤,就是指那些字符不可以进入系统。例如规定 #&*- 这些字符不能进入系统,就是对用户输入的内容进行检测,遇到规定的字符就认为是非法的输入。而对于用户输入内容的检验,是检查用户输入的字符串模式是否与程序要求的模式一样。
(3)程序的内部错误信息不要显示给用户。对于一般的用户而言,系统的错误信息并不重要,但对于一些别有用心、且具有丰富的攻击经验的恶意用户,他们会根据系统的错误,猜测整个系统运行的情况,从而猜测出更敏感的信息,对程序发起攻击。所以当系统出现错误的时候,不要把出错的页面显示给用户,而是把用户转到一个预先设计好的友好出错页面,给用户一个提示,说系统出错了,稍候重试之类。
4 用户输入校验的常用工具
(1)校验控件。各种开发工具都为开发者提供不同的工具。例如asp.net为开发者提供多种的校验控件。如RequiredFieldValidatot,RangValidator,RegularExpressionValidator,等。
(2)正则表达式。正则表达式是用于描述文本字符串中的模式的语言,它是通过把文本抽象成各种表达式,使用模式把字符串解析成子字符串或替换原来的文本或重新设置文本格式。例如用java实验email校验的正则表达式部分程序如下:
public class test{
public static void main(String[] args){
try{
String s = " ";
while(!s.equals("q")){
System.out.print("input:");
DataInputStream in = new DataInputStream(new BufferedInputStream(System.in));
s = in.readLine();
System.out.println("your input is :"+s);
String check = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
Pattern regex = Pattern.compile(check);
Matcher matcher = regex.matcher(s);
boolean isMatched = matcher.matches();
if(isMatched){
System.out.println("it's a email");
}else{
System.out.println("it's not a email");
}}}catch(Exception e){
System.out.println("error"+e.getMessage());}}}
(3)安全的字符串類或者库。.net中为开发者提供了安全的string类,我们在开发的过程中可以使用这些类来保障程序的安全。
5 结束语
网络时代,使得资源共享更方便,开放源码使得开发者的效率更高,但这往往也是恶意用户实验攻击的地方。对用户输入的校验能够使得我们在使用开放源码的时候,软件的安全也有保障。
参考文献:
[1]王辉,陈晓平,林邓伟. 关于跨站脚本问题的研究[J]. 计算机与设计,2004.8.
[2]龚静. 基于缓冲区溢出漏洞的攻击及防范技术探讨[J]. 湖州师范学院学报,2006.2.
[3]欧阳利军,戴术其. SQl注入入侵分析及防范[J]. 计算机与设计,2005.6.
[4]http://dev.csdn.net/article/43/43603.shtm.
本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。