45IT.COM- 电脑学习从此开始!
DIY硬件教程攒机经验装机配置
设计Photoshop网页设计特效
系统注册表DOS系统命令其它
存储主板显卡外设键鼠内存
维修显卡CPU内存打印机
WinXPVistaWin7unix/linux
CPU光驱电源/散热显示器其它
修技主板硬盘键鼠显示器光驱
办公ExcelWordPowerPointWPS
编程数据库CSS脚本PHP
网络局域网QQ服务器
软件网络系统图像安全
页面导航: 首页 > 设计学院 > 网络编程 > 数据库 >

SQL参数化防止SQL注入

电脑软硬件应用网 45IT.COM 时间: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%
------分隔线----------------------------
无法在这个位置找到: baidushare.htm
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片
推荐知识