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.ncwxdh.com/p/1'设定值

推荐阅读