当前位置: 代码迷 >> SQL >> 避免SQL注入三大步骤
  详细解决方案

避免SQL注入三大步骤

热度:61   发布时间:2016-05-05 11:26:06.0
避免SQL注入三大方法

      要说SQL注入还要从看.NET视频开始说起,听说在程序开发过程中,我们经常会遇到SQL注入问题,也就是指令隐码攻击。具体的原理到底是怎么回事儿,查了些资料好像涉及到了编译原理,也没能够看明白,只是视频中讲到了这三种方法是经常用来避免SQL注入最常用的方法,于是查些资料希望能对现学的知识有一定的了解。下面是对这三种方法具体如何使用的一个简单的介绍。

一、存储程序

         在学习数据库视频的时候接触过,它是存储在数据库中的一些事先编译好的指令。在用的时候不用重新编写,直接调用就好了。所以,使用它可以大大提高程序的执行效率。

那么,如何创建一个存储程序并使用它呢?这是我们今天要解决的问题。

         1.创建过程

            可编程性——下拉菜单——存储过程——右键——查询菜单———指定模板参数的值——新建查询——输入语句——查询菜单中的分析检查语法是否正确——执行

        2.具体创建语法

在创建存储程序时,为了应对各种变换的数据,通常会涉及到带参数的存储程序,[email protected]

Create Procedure procedurename[:number] --[:number]表示一组存储程序中的第几个,如果只有一个,此参数可忽略[@parameter  data_type] [default] [OUTPUT]   [email protected],default 表示默认值,OUTPUT表示输出值即输出值asSqlStatement   --[]代表可选参数

         3.具体执行过程

        

exec[ute] procedurename [参数]

       举例:

--创建CreateProcedure scores@score1smallint,@score2smallint,@score3smallint,@score4smallint,@score5smallint,@myAvgsmallint Output    --Output可用return来代替As select@myAvg=(@[email protected][email protected][email protected][email protected])/5--调用过程[email protected] smallint      --将输出结果放在avgscore中Execavgscore Output 5,6,7,8,9,   --带有参数的存储过程调用时,必须加上Output关键字,否则SQL会当做参数来对待


   小结:存储程序的创建可分为带参数和不带参数,以及含有默认值和输出值得存储程序,但是它们的使用原理是一样的。只是带输出值得存储程序在调用过程中要使用关键字Output来对要输出的变量进行声明,否则SQL会将它当做参数来处理。

注意:创建存储程序后,我们可以在编写程序时,直接调用存储程序的名称来代替复杂的查询语句:

strSQL="select ............;"strSQL="Execute procedureName;"

二、参数化SQL

    是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,[email protected]?来表示参数。

    在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成 SQL 指令的编译后,才套用参数运行,因此就算参数中含有恶意的指令,由于已经编译完成,就不会被数据库所运行,因此,可从一定程度上避免SQL注入。

参数化SQL在不同数据库中支持的方式有一定的差别。SQL server中二者均支持。

在不用的数据库上基本语法都是一样的,但在不同的运行平台上客户端的书写有不同之处,在这里就拿现在我正在学习的SQL server在.net上执行来举例。

--SQL server中的参数化SQL语句:SELECT * FROM myTable WHERE myID = @myIDINSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)


'.在.NET上执行SqlCommand sqlcmd = new SqlCommand("INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)", sqlconn);sqlcmd.Parameters.AddWithValue("@c1", 1); ' 设定参数 @c1 的值。sqlcmd.Parameters.AddWithValue("@c2", 2); ' 设定参数 @c2 的值。sqlcmd.Parameters.AddWithValue("@c3", 3); ' 设定参数 @c3 的值。sqlcmd.Parameters.AddWithValue("@c4", 4); ' 设定参数 @c4 的值。sqlconn.Open();sqlcmd.ExecuteNonQuery();sqlconn.Close();

在向command中增加参数时,还有其他的方法,如:

sqlcmd.parameters.Add("@c1",SqlDbType.BigInt)  'BigInt为c1的数据类型sqlcmd.parameter("@c1").value=1     '设定值

三、Regular Expression

     简称REs是一种非常强大的文字验证技术。通常我们在设计程序时,如果要在TEXT中输入数字的话,那么我们会用到IsNumberic函数来限制,但是很多情况,为了用户方便,我们不止要用到限定数字这一个技术,还有很多关系式需要我们去遵循,如手机号码要限定成11为,邮箱号码要限制相应的格式等。这时候就用到了REs这种技术。它可以为我们要输入的内容提供一个模板,让用户的输入必须遵循这个模板的格式,如果格式不正确,则程序不能继续执行。这样也可以避免SQL注入。

例如

\d   -------代表数字

\d{5}  -------代表5位数字

\w+@\w+ [email protected]+表示要有至少一个的字符,@[email protected]


当然在使用这种技术之前,是有条件的,首先,它需要引用一个命名空间,具体如下:


Imports RE=System.Text.RegularExpressions.Regex

这样还不够,我们需要一个方法来做验证用户输入是否正确的工作,这里,我们要用到一个方法match,具体使用如下:

Dim input,pattern As StringInput=Me.txtInput.TextTrim()Pattern=Me.txtPattern.TextIf  Re.Mathc(input,pattern).Success Then ‘使用Match方法来对用户输入的内容与定义好的模板进行验证      MessageBox.Show("True,input matches pattern")Else       MessageBox.Show("False,input does not match pattern")End if 
以上,是通过看.net视频总结出来的避免SQL注入的三种方法,由于对专业知识了解有限,具体原理并不清楚,有待以后深入学习后总结。





        










1楼lfmilaoshi昨天 21:59
在实践中理解和学习。
  相关解决方案