ASP.NET参数化查询
ASP.NET参数化查询一、参数化查询原理
在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成 SQL指令的编译后,才套用参数运行,因此就算参数中含有恶意的指令,由于已经编译完成,就不会被数据库所运行。
有部份的开发人员可能会认为使用参数化查询,会让程序更不好维护,或者在实现部份功能上会非常不便,然而,使用参数化查询造成的额外开发成本,通常都远低于因为SQL注入攻击漏洞被发现而遭受攻击,所造成的重大损失。
参数化查询的关键是查询优化器将创建一个可以重用的缓存计划。通过自动地或编程使用参数化查询,SQL Server可以优化类似T-SQL语句的处理。这个优化消除了对使用高贵资源为这些类似T-SQL语句的每一次执行创建一个缓存计划的需求。而且通过创建一个可重用计划,SQL Server还减少了存放过程缓存中类似的执行计划所需的内存使用。
二、ASP.NET参数化查询实例
//连接数据库时,需要添加必须的命名空间
using System.Data;
using System.Data.SqlClient;
//代码
string connectString = @"Data Source=l47\\sqlexpress;Initial Catalog=TestDB;Integrated Security=True";
SqlConnection scon = new SqlConnection(connectString);
scon.Open
SqlCommand selectCmd = new SqlCommand();
selectCmd.CommandText = "select * from student where 学号=@sn";
selectCmd.Parameters.Add("@sn", SqlDbType.Char, 10);//sql指令中存在一个参数,叫@sn,它的类型是字符型,字节长度是10个
selectCmd.Parameters["@sn"].Value = "123456";
selectCmd.Connection = scon;
SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = selectCmd;
DataSet ds = new DataSet();
sda.Fill(ds, "student");
三、参数化查询意义及注意点
1.可以防止SQL注入
2.可以提高查询性能(主要是可以复用查询计划),这点在数据量较大时尤为重要
3.参数化查询参数类型为可变长度时(varchar,nvarchar,char等)请指定参数类型及长度,若为值类型(int,bigint,decimal,datetime等)则仅指定参数类型即可
4.传值为varchar(max)或者nvarchar(max)时,参数长度指定为-1即可
5.看到有些童鞋对于存储过程是否要指定参数长度有些疑惑,这里补充下,若调用的是存储过程时,参数无需指定长度,如果指定了也会忽略,以存储过程中定义的长度为准,不会因为没有指定参数长度而导致重新编译,不过还是建议大家即便时调用存储过程时也加上长度,保持良好的变成习惯
6、因为参数化查询可以重用执行计划,并且如果重用执行计划的话,SQL所要表达的语义就不会变化,所以就可以防止SQL注入,如果不能重用执行计划,就有可能出现SQL注入,存储过程也是一样的道理,因为可以重用执行计划。