首页 > 代码库 > 避免SQL注入三大方法

避免SQL注入三大方法

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

一、存储程序

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

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

         1.创建过程

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

        2.具体创建语法

在创建存储程序时,为了应对各种变换的数据,通常会涉及到带参数的存储程序,其中参数用@来表示。

Create Procedure procedurename[:number] --[:number]表示一组存储程序中的第几个,如果只有一个,此参数可忽略

[@parameter  data_type] [default] [OUTPUT]   --@parameter表示存储过程中的参数,default 表示默认值,OUTPUT表示输出值即输出值

as

SqlStatement   --[]代表可选参数

         3.具体执行过程

        

exec[ute] procedurename [参数]

       举例:

--创建

CreateProcedure scores

@score1smallint,

@score2smallint,

@score3smallint,

@score4smallint,

@score5smallint,

@myAvgsmallint Output    --Output可用return来代替

As select

@myAvg=(@score1+@score2+@score3+@score4+@score5)/5

--调用过程

Declare@avgscore smallint      --将输出结果放在avgscore中

Execavgscore Output 5,6,7,8,9,   --带有参数的存储过程调用时,必须加上Output关键字,否则SQL会当做参数来对待


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

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

strSQL="select ............;"

strSQL="Execute procedureName;"

二、参数化SQL

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

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

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

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

--SQL server中的参数化SQL语句:

SELECT * FROM myTable WHERE myID = @myID

INSERT 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=http://www.mamicode.com/1     ‘设定值>

三、Regular Expression

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

例如

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

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

\w+@\w+ -------@前的w+表示要有至少一个的字符,@代表这个模板中必须有一个@字符。


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


Imports RE=System.Text.RegularExpressions.Regex

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

Dim input,pattern As String

Input=Me.txtInput.TextTrim()

Pattern=Me.txtPattern.Text

If  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注入的三种方法,由于对专业知识了解有限,具体原理并不清楚,有待以后深入学习后总结。