ASP.NET网站中防SQL注入攻击技术的研究

时间:2022-09-26 05:52:12

ASP.NET网站中防SQL注入攻击技术的研究

[摘 要]本文主要针对目前网站安全面临的SQL注入攻击来进行分析研究,并从客户端和服务器端两个方面来研究如何防范SQL注入攻击。

[关键词]网站安全 SQL注入 防SQL注入

一、引言

随着时代的发展,网路应用的不断深入,互联网上网站数量以惊人的速度增加。尽管如此,网络上环境的复杂性、多变性,以及信息系统的脆弱性,决定了现有的计算机系统还不具备与自身的应用发展规模相对应的安全防护能力,大量的网络威胁采用各种隐蔽的方式不断地冲击着网络应用平台。因此,对网站相关安全技术进行研究是很有必要的。

二、防SQL注入攻击技术的实现

1、SQL注入攻击技术简介

SQL注入攻击是当前网络攻击的主要手段之一,SQL注入技术在国外最早出现在1999年,我国在2002年后开始大量出现。目前还没有一个严格的定义来解释什么是SQL注入漏洞,但其本质是攻击者能够利用应用程序没有对用户输入的数据进行严格约束和合法性检查等错误在程序中插入并执行自己构造的SQL语句。

例如,在在Web应用程序的登录验证程序中,一般有用户名和密码两个参数,当用户点击提交按钮时,服务器端会根据用户提交的用户名和密码信息来与数据库中的用户信息表进行比较,如果不对用户输入的信息进行任何限制,在服务器端也不对用户提交的信息进行任何检查,其SQL语句就可以写成:

string strqry = "Select * From T_Admin where Userid='"+name+"' and UserPwd='"+pwd+"'" ;

显然上面这段代码并没有对用户的输入进行任何安全性的检查,如果数据库是SQL Server,那么恶意用户可以在用户名中输入admin’or 1=1-- ,在密码框中输入任何值(如:111),这样,SQL脚本解释器中的上述语句就会变为:

Select * From T_Admin where Userid='admin' or 1=1 -- and UserPwd='111'

由于在SQL Server数据库中“--”表示注释,因此“--”后面的语句都为注释语句,这样在两个条件“Userid='admin'”和“1=1”中,只要任何一个成立,该语句就会执行成功,而1=1在逻辑判断上是恒成立的,因此不管T_Admin表中有没有admin这个用户,该语句都会执行成功并错误地将权限授予攻击者。

2、下防范SQL注入攻击策略的实现

要防范SQL注入攻击,需要对用户输入的数据进行检查,检查可以在客户端进行,也可以在服务器端进行。在客户端,攻击者完全有可能获得网页的源代码,修改验证合法性的脚本(或者直接删除脚本),然后将非法内容通过修改后的表单提交给服务器。因此,要保证验证安全性,唯一的办法就是在服务器端也执行验证。但使用客户端验证可以减少页面往返次数以提升性能,改进用户体验。因此,在实际中往往在客户端和服务器端同时进行检查。

(1)客户端的防SQL注入功能的实现

在客户端,可以JavaScript 脚本语言来编写用于检查用户输入的函数,也可以通过提供的输入输入验证控件来检查用户的输入。其中,使用提供的输入验证控件来检查用户的输入是最简单的方法。

在中,RegularExpressionValidator控件是一个强大的工具。他可以检验文本是否和定义的正则表达式中的模式匹配。你只需要简单地配置ValidationExpression属性的正则表达式即可。正则表达式也是一个强大的工具,它允许指定复杂的规则,该规则指定字符和字符顺序(位置和出现次数)。为防止用户输入一些危险的字符,可以利用该正则表达式“^[0-9A-Za-z_]+$”,该表达式表示的意思是用户只可以输入字母和数字。要运用该正则表达式,只需在将其赋值给RegularExpressionValidator控件的ValidationExpression属性即可。

(2)服务器端的防SQL注入功能的实现

由于通过客户端进行验证并不能完全保证安全性,因此,为保证安全性,最有效的办法是在服务器端进行验证。在服务器端,通常的做法有两种,一种是构造一个专门的函数来将特殊字符和字符串过滤掉,另一种是对SQL语句使用命令参数方式。

过滤函数一般可以表示如下:

Public string ConvertSql(string inputStr)

{

inputString = inputString.Trim();

inputString = inputString.Replace("' ", " ");

inputString = inputString.Replace("=", " ");

inputString = inputString.Replace(";―――", " ");

inputString = inputString.Replace("and", " ");

inputString = inputString.省略中并非最有效的方式, 因为如果文本确实需要包含这些符号,这样就引入了其他麻烦,更好的解决办法是使用参数化命令来防止SQL注入攻击。参数化命令是在SQL文本中使用占位符的命令。占位符表示需要动态替换的值,它们通过Command对象的Parameters集合来传送。在管理员登陆页面,如果使用参数化命令,其SQL语句就可以表示为:

Select * From T_Admin where Userid=@name and UserPwd=@pwd

在该SQL语句中@name和@pwd是参数的名字,所有参数必须以@字符开头。使用参数化命令后,当恶意用户在用户名中输入admin’or 1=1--时,应用程序就会从T_Admin表中检索用户名为admin’or 1=1--的用户,显然这样就不可能得到任何记录,因为没有一个管理员的用户名是admin’or 1=1--。参数化命令的实现可表示如下。

//使用参数化命令申明SQL语句

string mysql = "Select * From T_Admin where Userid=@name and UserPwd=@pwd";

OleDbConnection conn = new OleDbConnection(connStr );

OleDbCommand cmd = new OleDbCommand(mysql, conn);

//对@name参数赋值

cmd.Parameters.AddWithValue("@name", name);

//对@password参数赋值

cmd.Parameters.AddWithValue("@pwd", Password);

参考文献:

[1]David Litchfield,Chris Anley.The database hacker's handbook[M].Wiley Publishing Inc,2005

[2]陈小兵,张汉煜,骆力明,黄河 . SQL注入攻击及其防范检测技术研究[J] . 计算机工程与应用 , 2007,43(11)

[3]Bass L,Clements P,Kazman R.Software Architecture in practice[M].北京:清华大学出版社,2003:71-127

上一篇:浅析中小企业融资难问题 下一篇:对于外汇市场中外汇风险管理问题的研究