避免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=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注入的三种方法,由于对专业知识了解有限,具体原理并不清楚,有待以后深入学习后总结。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。