搜索
您的当前位置:首页正文

如何防范SQL注入攻击

来源:意榕旅游网
第9卷第4期 2009年9月 南京工业职业技术学院学报 Journal of Nanjing Institute of Industry Technology Vo1.9,No.4 Dec.,2009 文章编号:1671—4644(2009)04—0046—02 如何防范SQL注入攻击 彭复明 (南京工业职业技术学院 信息工程系,江苏 南京210046) 摘要:阐述了SQL注入攻击的概念,用实例描绘了它攻击登录页面的具体手段与过程,全面分析了登录过程易 受攻击的原因,给出了两种切实可行防范SQL注入攻击的方法。 关键词:SQL注入;正则表达式;登录 中图分类号:TP393.08 文献标识码:A 在大型的ASP.NET项目中,查询是必不可少的功能之 一上述SQL注入攻击之所以能成功,是因为有以下两点 …。但在近些年的网络应用实践中,数据库的网络查询 原因:(1)应用程序没有对“”’字符作特别处理。(2) SQL验证语句存在大的隐患。为了防范SQL注入攻击,围 绕以上两点内容,下面给出两个具体的方法来解决这个问 题。 屡屡遭到SQL注入(SQL Injection)攻击。为此,有关防范 SQL注入攻击的研究论文层出不穷。它们大多对防范SQL 注入攻击指明了方向,但都或多或少存在一些问题与局限 性。例如,有一些文章把本来比较简单的问题变得过于复 杂;有些只有理论研究,没有给出实际运用的例子等等。 SQL注入是将SQL代码传递到应用程序的过程中,实 际运行并不是按照开发人员预定或期望的方式进行 J。在 ASP.NET网页的登录界面中,通常要求用户输入用户名与 密码,然后点击登录按钮进行验证。验证一个帐户是否合法 的最关键一条SQL语句是: ”1正则表达式验证控件法 正则表达式匹配验证控件的功能是检查用户数据输入的 字符串,看它是否匹配已定义好的正则表达式的模式 。 这里的用户框与密码框必须禁止出现“”’字符。 在网页中,针对用户框与密码框,增加正则表达式匹配 验证控件。选取属性ValidationExpression=“[ ] ”,就 能禁止“”’字符的出现。其中[ ]表示单个非“”’字 符; 表示零次或多次匹配前面的字符或子表达式。 ] select UserID from Users where UserName= ”+Text— Box1.Text+” AND Password= ’+TextBox2.Text+” ’ 显然,此条SQL语句的本意是:如果用户输入的用户 名与密码在数据库表中存在的话,就说明该帐户合法。然 就表示可以出现零次或多次非“”’字符。再取属性Er- rorMessage=“非法输人”。同样,选取 1 = 1 or 1 = 作 而,当选取"or~1: 1 or 1 : 0作为用户名时(密码设置为 空),上述SQL语句变成了下面这样一条语句: select UserlD from Users where UserName= or 1 = 1 or 为用户名,当光标切换到密码框时,界面上就会显示“非 法输入”,表示这样的用户名不可接受。图2就是正则验证 控件成功阻止SQL注入攻击的画面。 1 =勺 AND Password= 由于1 =,l 恒成立,整个where后面的式子就为真。也 就是说,即使不使用合法的帐户,也能通过验证。图1就是 上述SQL注入攻击成功的例子。 图2,-r: ̄jl验证控件阻止SQL注入攻击 2釜底抽薪法 图1 SQL注入攻击成功 收稿日期:2009—09—20 俗话说得好,扬汤止沸,不如釜底抽薪。之所以存在 作者简介:彭复明(1962一),男,江苏南京人,南京工业职业技术学院讲师,工学硕士。 第9卷第4期 彭复明:如何防范SQL注入攻击 47 SQL注入攻击的问题,是因为SQL验证语句存在巨大隐患。 键语句if(tO==str0&&tl==str1)是两个字符串变量作 如果把SQL验证语句中where部分去除,让一段应用程序代 码来处理,就可以收到非常好的效果。下面就给出这段程序 比较,它不会产生任何“or”操作。上面if语句中的逻辑运 算不可能为真,所以这种SQL注入攻击不会成功。图3就 的完整代码。 是釜底抽薪法成功阻止SQL注入攻击的案例。 SqlConnection conn=new SqlConnection(“server=.:da— tabase=WebUserDB;trusted—connection=ture”);//创建数 据库连接字 protected void Buttonl—Click(object sender,EventArgs e)//单击登录按钮运行 {stirng tO,tl,str0,strl;//定义字符串变量 Ot=(stirng)TextBox1.Text.Trim();//赋用户名 tl=(stirng)TextBox2.Text.Trim();//赋密码 SqlCommand open—users=new SqlCommand(“select UserName,Password from Users”,conn); //不带任何条件检索出数据库中所有用户名及密码。此 处大大地修改了之前的SQL验证语句 conn.Open();//打开数据库连接 SqlDataReader dr=open—users.ExecuteReader(); 图3釜底抽薪法阻止SQL注入攻击 //执行上述SQL查询语句,结果存放dr中 while dr.Read()//还有记录吗?循环 3 结束语 {str0=dr.GetString(0).Trim();//取用户名 以上介绍了两种防范SQL注入攻击的方法。第一种正 strl:dr.GetString(1).Trim();//取对应密码 则表达式验证控件法非常简单、实用。而第二种釜底抽薪 if(tO==str0&&tl==str1)//与用户输入一致 法,一开始就杜绝了任何非法侵入,从根本上阻止了SQL 吗? 注入攻击。 {Label3.Text=“登录成功!”;//是,显示成功 conn.Close();//关闭数据库连接 参考文献: return;//返回}} [1]张跃东.基于ASP的通用条件查询模块的设计与实现 Label3.Text=“登录失败!!!”;//所有记录都不成 [J].南京工业职业技术学院学报,2008(2):50—51. 功,显示失败 [2]李玉林,王岩.ASP.NET 2.0网络编程从入门到精通 conn.Close();//关闭数据库连接} [M].北京:清华大学出版社,2006:196. 当选取"or~1: 1 or 1 = 0作为用户名(密码框为空), [3]崔永红.ASP.NET程序设计[M].北京:中国铁道出 并单击登录键后,运行前面代码。此时字符串变量to的值 版社,2007:116. 为“"or~1= 1"or~1=0”,同样str0也是字符串变量。其中关 How to Prevent SQL Injection Attacks PENG Fu-ming (Nanjing Institute ofIndustry Technology,Na ng 210046,China) Abstract:This paper explains the concept of SQL injection attack,illustrates the speciifc means and process of its attacks on the logging page,details the reasons of being vulnerable to attacks and presents two applicable methods of preventing SQL injection attacks. Key words:SQL Injection;regular expression;log on (责任编辑周 源) 

因篇幅问题不能全部显示,请点此查看更多更全内容

Top