WD1X.COM - 问答一下,轻松解决,电脑应用解决专家
主板显卡CPU内存显示器
硬盘维修显卡维修显示器维修
注册表系统命令DOS命令Win8
存储光存储鼠标键盘
内存维修打印机维修
WinXPWin7Win11Linux
硬件综合机箱电源散热器手机数码
主板维修CPU维修键盘鼠标维修
Word教程Excel教程PowerPointWPS
网络工具系统工具图像工具
数据库javascript服务器
PHP教程CSS教程XML教程

SQL参数化防止SQL注入

更新时间:2012-12-22 10:43 作者:佚名点击:

参数化查询是访问数据库时,在需要填入数值或数据的地方,使用参数 来给值。
在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成SQL指令的编译后,才 套用参数运行,因此就算参数中含有指令,也不会被数据库运行。Access、SQL Server、MySQL Oracle都支持参数化查询。

在参数化SQL中参数名的格式跟其在存储过程中生命存储过程参数一致,例如在Oracle中存储过程参数一律以”:”开头,在MS SQL Server中存储过程参数一律以”@”开头,而在MySQL中存储过程(MySQL从5.0以后版本支持存储过程)参数一律以“?”开头,所以在参数化SQL语句中参数名有些不一样 。

需要说明的是,除了Access之外,操作其它数据库可以不必要按照参数在SQL语句中出现的顺序添加进去一样可以正确执行,但是在Access中一定按照插入的列的顺序添加参数,因为“OLE DB.NET Framework 数据提供程序使用标有问号 (?) 的定位参数,而不使用命名参数(MSDN)”,所以给添加参数和赋值一定要按照列的顺序。

asp使用access数据库参数化例子:

ASP环境下的参数化查询主要由Connection对象和Command对象完 成。
Access数据库只支持匿名参数,在传入参数的位置用问号代替即可。SQL Server数据库虽然支持匿名和非匿名的参数,但是在ASP中也仅能使用匿名参数。

var cmd = Server.CreateObject(“ADODB.Command);
cmd.ActiveConnection = conn;
cmd.CommandType = 1;
cmd.CommandText =SELECT TOP 1 * FROM [User] WHERE UserName = ? AND Password = ?;
cmd.Parameters.Append(cmd.CreateParameter(”@UserName”, 200, 1, 20, “user01″));
cmd.Parameters.Append(cmd.CreateParameter(”@Password”, 200, 1, 16, “123456));
var rs = cmd.Execute();
Response.Write(rs(”UserId”).value);
rs.Close();
conn.Close()

在.NET程序中使用参数化查询
.NET环境下的查询化查询也是通过Connection对象和Command对象完成。如果数据库是SQL Server,就可以用有名字的参数了,格式是“@”字符加上参数名。

SqlCommand cmd = new SqlCommand(SELECT TOP 1 * FROM [User] WHERE UserName = @UserName AND Password = @Password“);
cmd.Connection = conn;
cmd.Parameters.AddWithValue(”UserName”, “user01″);
cmd.Parameters.AddWithValue(”Password”, “123456);
SqlDataReader reader = cmd.ExecuteReader();
reader.Read();
int userId = reader.GetInt32(0);
reader.Close();
conn.Close();

MySQL的参数格式与SQL Server有点区别,是以“?”加上参数名。

MySqlCommand cmd = new MySqlCommand(SELECT * FROM `User` WHERE UserName = ?UserName AND Password = ?Password LIMIT 1);
cmd.Connection = conn;
cmd.Parameters.AddWithValue(”UserName”, “user01″);
cmd.Parameters.AddWithValue(”Password”, “123456);
MySqlDataReader reader = cmd.ExecuteReader();
reader.Read();
int userId = reader.GetInt32(0);
reader.Close();
conn.Close();

在Oracle中使用参数化SQL是以“:”加上参数名。

OracleCommand cmd = new OracleCommand(SELECT * FROM `User` WHERE UserName = :UserName AND Password = :Password LIMIT 1);
cmd.Connection = conn;
cmd.Parameters.AddWithValue(”UserName”, “user01″);
cmd.Parameters.AddWithValue(”Password”, “123456);
OracleDataReader reader = cmd.ExecuteReader();
reader.Read();
int userId = reader.GetInt32(0);
reader.Close();
conn.Close();
顶一下
(0)
0%
踩一下
(1)
100%
------分隔线----------------------------
你可能感兴趣的内容