首页 > 范文大全 > 正文

基于ASP.NET 3.5的SQL注入攻击分析及防范措施

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于ASP.NET 3.5的SQL注入攻击分析及防范措施范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:SQL注入攻击正成为近年来攻击者最有效的WEB入侵手段。文中简要介绍了SQL注入攻击的原理,着重阐明了防范这种攻击的几种有效措施。

关键词:;SQL注入;LINQ;存储过程;安全

中图分类号:TP393文献标识码:A文章编号:1009-3044(2011)23-5601-02

Analysis of SQL Injection Attack and Prevention Approach Based on 3.5

WANG Hong-gang

(Xi'an Siyuan University, Xi'an 710038, China)

Abstract: sql Injection Attack is becoming the most effevtive means of web invasion for Attacker in recent years. This paper introduces the principle of SQL Injection Attackand illustrutes effective preventive measures of this attacks.

Key words: ; SQL injection attack; LINQ; stored procedure; security

SQL注入攻击(SQL Injection),是当前网络攻击的主要手段之一。其本质就是攻击者将其他SQL语句插入在WEB表单的输入控件或页面请求的查询字符串中,欺骗服务器执行恶意的SQL语句,从而成功实现对数据库进行不受权限的访问。由于SQL注入攻击是从正常的端口进行访问,防火墙不会对这种攻击发出警报,一般只能靠管理员查看Web管理日志进行分析[1]。

技术拥有有很多的优点,更能适合于现代的Web 应用的需要。但是,由于开发者的技术水平的差异致使现在的很多用 开发的Web 应用程序存在着很多隐患,同时由于大量数据库的使用,使得利用SQL 语言的攻击事件时有发生。因此,本文以3.5+SQL Server2008为例简要说明SQL注入攻击的一般原理和方法,并且给出实际应用中的防范措施

1 SQL注入攻击的实现原理

结构化查询语言(SQL)是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。SQL注入攻击主要是通过构建特殊的输入,这些输入往往是SQL语法中的一些组合,并且将这些输入作为参数传入Web应用程序,通过执行SQL语句来进行恶意操作[2]。下面以登录验证中的模块为例,说明SQL注入攻击的实现原理。

假设Web项目中存在users表,其表内包含username和password字段,并且用户名和密码分别是admin与123456。

Web应用程序根据用户提交的数据生成SQL查询语句,如果查询返回用户记录数量为1,则说明登陆成功;返回用户记录数量为0或者>1则说明登陆失败。此时生成的SQL语句为:

select count(*) from users where username='admin' and password='123456’

如果程序员没有对用户输入的username和password两个参数值进行合理的限制,当攻击者给username参数赋值为'admin' and 1=1--时,SQL语句会变为:

select count(*) from users where username='admin' and 1=1--and password='123456’

此时1=1在逻辑判断上是恒成立,只要能确定用户名存在,则登陆验证就会成功。同理还可以对数据库中的数据进行查询、插入、删除等危险操作:

1) Select * from users where username='admin';drop table users--删除users表。

2) '; union select sum(username) from users--从users表中查询出username的个数。

3) '; insert into users values('rocky', '111111' )--在user表中插入值。

2 SQL注入防范措施

2.1 在 3.5中使用LINQ查询。

.NET 3.5引入了一个新技术即语言集成查询(LINQ)。LINQ能自动解决SQL注入攻击的问题,因此在使用LINQ的情况下,SQL注入是不太可能发生的。

在C#中提供了from、where、select、group、into、orderby、join 和let等字句,通过这些字句创建 LINQ 查询[3]。下面简单介绍使用 LINQ to SQL实现对数据库的访问操作(假设与数据库及表对应的类已经创建)其中 db 为 DataBase 类的实例。

2.1.1 使用 LINQ to SQL 实现查询操作

以实现从Movies表中查询标题为Titanic的影片为例,只需用如下操作即可:

var query = from m in db.Movies where m.title == “Titanic”selectm;

2.1.2 使用 LINQ to SQL 实现插入操作

以实现向Movies表中添加新纪录为例,只需先使用 InsertOnSubmit( ) 方法将一个实体添加到库存表中,然后调用 SubmitChanges( ) 方法对数据库执行插入操作,具体实现过程如下[4]:

Movie m=new Movie{title=”The princess Bride”,Director=”Rob”,Runtime=98};

db.Movies. InsertOnSubmit( m) ;

db.SubmitChanges( ) ;

2.1.3 使用 LINQ to SQL 实现更新操作

以更新Movies表中Runtime为例,首先使用Single方法获得要更新的指定对象,然后修改对象的属性值,再调用 SubmitChanges( ) 方法,对LINQ to SQL 实体和数据表进行更新。

具体实现过程如下:

Var Movie=db.Movies.Single(m=>m.Title==”Titanic”);

Movie.Runtime=150;

db.SubmitChange( ) ;

2.1.4 使用 LINQ to SQL 实现删除操作

以实现删除Movies表中的一行纪录为例,首先通过选择操作到要更新的行,然后调用方法DeleteOnSubmit( ) 删除获得对象,最后把更改提交到数据库以对数据库进行删除。具体实现过程如下:

Var query = from m in db.Movies where m.Title= =” Titanic” select m;

Foreach( var m in query)

{ db.Movies.DeleteOnSubmit( m) ; }

db.SubmitChange( ) ;

2.2 使用参数化的SQL查询

参数化查询(Parameterized Query)是指在访问数据库时,在需要填入数值或数据的地方,使用参数来给值。

在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有指令,也不会被数据库运行。Microsoft SQL Server 的参数格式是以 "@" 字符加上参数名称而成,SQL Server 亦支持匿名参数 "?"。

以下是一个使用参数化查询的例子,如果攻击者在username 中输入 'or 1=1--,参数化查询会把 'or1=1--作为一个字符串整体在数据库中作字面匹配。

SqlCommand cmd = new SqlCommand("select top 1 * from users where username =@UserName and password = @Password");

cmd.Connection = conn;

cmd.Parameters.AddWithValue("username", "admin");

cmd.Parameters.AddWithValue("password", "123456");

SqlDataReader reader = cmd.ExecuteReader();

2.3 使用存储过程

存储过程是一组为了完成特定功能的SQL语句集,是利用SQL Server所提供的Transact-SQL语言所编写的程序,经编译后存储在数据库中。存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。使用存储过程操作数据库,能够实现对相应的数据访问权限的限制,避免非授权用户对数据的访问,还可以过滤输入参数,保证数据安全。

3 结束语

随着Web应用技术的普及,SQL注入攻击被攻击者广泛地使用,人们对于SQL注入攻击已经越来越重视。对于Web应用的开发人员与维护人员必须熟悉SQL注入攻击的防范措施。在应用开发时采用这些防范措施,这样才能远离SQL注入攻击对Web应用的危害,保护系统的安全。

参考文献:

[1] 祝种谷,张晟防范SQL注入攻击的研究与实践[J].电脑知识与技术,2010,6(27):7724-7725.

[2] 王云,郭外萍,陈承欢.WEB项目中的SQL注入问题研究与防范方法[J].计算机工程与设计,2010,31(5):976-977.

[3] 张斌斌.陈建军.姚坤.基于的电子元器件管理系统的设计与实现[J].信息技术,2011(3):64-65.

[4] Evjen B,Rader 高级编程[M].北京:清华大学出版社,2008:461-465.