mysql学习笔记(⼀)之mysqlparameter
ADO.NET基础琐碎总结-----参数化查询
参数化查询(Parameterized Query )是指在设计与数据库链接并访问数据时,在需要填⼊数值或数据的地⽅,使⽤参数 (Parameter) 来给值,这个⽅法⽬前已被视为最有效可预防SQL注⼊攻击 (SQL Injection) 的攻击⼿法的防御⽅式。下⾯将重点总结下Parameter构建的⼏种常⽤⽅法。
说起参数化查询当然最主要的就是如何构造所谓的参数:⽐如,我们登陆时需要密码和⽤户名,⼀般我们会这样写sql语句,Select * from Login where username= @Username and password = @Password,为了防⽌sql注⼊,我们该如何构建@Username和@Password两个参数呢,下⾯提供六种(其实⼤部分原理都是⼀样,只不过代码表现形式不⼀样,以此仅作对⽐,⽅便使⽤)构建参数的⽅法,根据不同的情况选⽤合适的⽅法即可:
说明:以下loginId和loginPwd是户登陆时输⼊登陆⽤户名和密码,DB.conn是数据库连接,⽤时引⼊using System.Data.SqlClient命名空间
⽅法⼀:
SqlCommand command = new SqlCommand(sqlStr, DB.conn);
command.Parameters.Add("@Username", SqlDbType.VarChar);
command.Parameters.Add("@Pasword", SqlDbType.VarChar);
command.Parameters["@Username"].Value = loginId;
command.Parameters["@Pasword"].Value = loginPwd;
⽅法⼆:
SqlCommand command = new SqlCommand();
command.Connection = DB.conn;
command.CommandText = sqlStr;
command.Parameters.Add(new SqlParameter("@Username", loginId));
command.Parameters.Add(new SqlParameter("@Pasword", loginPwd));
⽅法三:
Sqlcommand cmd=new Sqlcommand(sqlStr, DB.conn);
cmd.parameters.add("@Username",DbType.varchar).value=loginId;
cmd.parameters.add("@Pasword",DbType.varchar).value=loginPwd;
⽅法四:
Sqlcommand cmd=new Sqlcommand(sqlStr, DB.conn);
cmd.parameters.addwithvalue("@Username",loginId);
cmd.parameters.addwithvalue("@Pasword",loginPwd);
⽅法五:
Sqlcommand cmd=new Sqlcommand(sqlStr, DB.conn);
SqlParameter para1=new SqlParameter("@Username",SqlDbType.VarChar,16);
para1.Value=loginId;
cmd.Parameters.Add(para1);
SqlParameter para2=new SqlParameter("@Pasword",SqlDbType.VarChar,16);
para2.Value=loginPwd;
cmd.Parameters.Add(para2);
⽅法六:
SqlParameter[] parms = new SqlParameter[]
{
new SqlParameter("@Username", SqlDbType.NVarChar,20),
new SqlParameter("@Pasword", SqlDbType.NVarChar,20),
};
SqlCommand cmd = new SqlCommand(sqlStr, DB.conn);
// 依次给参数赋值
parms[0].Value = loginId;
parms[1].Value = loginPwd;
//将参数添加到SqlCommand命令中
foreach (SqlParameter parm in parms)
{
cmd.Parameters.Add(parm);
}
法和实现⽅法的不同,也可以说是语法糖,但后记:鉴于园友对dedeyi,⿁⽕飘荡,guihwu的疑问,我在写⼀个说明。六种⽅法其实我想⼤家都明⽩微软的底层都是⼀样的有兴趣的可以反编译⼀下,只是写
的疑问,我在写⼀个说明。六种⽅法其实我想⼤家都明⽩微软的底层都是⼀样的有兴趣的可以反编译⼀下,只是写法和实现⽅法的不同,也可以说是语法糖,但是每个⼈都会选择⼀个⾃⼰想⽤的,我就随便总结了下。下⾯具体在把这些⽅法做个简要说明。⽅法⼀和⽅法⼆都是⽤SqlCommand的parameters属性的add⽅法,add⽅法⾥⾯有七个构造函数,其实⽅法⼆就是⽤
的构造函数,当然还有其他的构造函数可以⽤,可以加⼊类型参数、指定长度等,我仅仅是说下形式,具体的msdn说的⾮常清楚。⽅法三和⽅法⼀的第⼀个构造函数,⾄于为什么没写类型是因为有以object为参数
为参数的构造函数,当然还有其他的构造函数可以⽤,可以加⼊类型参数、指定长度等,我仅仅是说下形式,具体的
⾄于⽅法四那就不同了:在
在.Net Framework 2.0中SqlClient增加了AddWithValue(string parameterName, object value)⽅法。该
⽅法简化了调⽤储存过程的输⼊参数过程,在运⾏时对所输⼊完全⼀样仅仅形式不同。⾄于⽅法四那就不同了:
完全⼀样仅仅形式不同。
的数据类型进⾏判断,获取对应的数据库类型。因此该⽅法在运⾏效率上⽐⽤ Add(string parameterName, SqlDbType sqlDbType, int size, string sourceColumn)⽅法要低。在效率要求较⾼的地⽅仍然建议使⽤
是⼀样的,⽅法五只是分开写了。⽅法六⽤了c#3.0的特性——集合初始化器,代码也很清晰,原理同上,不再赘述。
简化代码编写量。⽅法五和⽅法⼆也是⼀样的,⽅法五只是分开写了。⽅法六⽤了
Add()⽅法,其它场合可以使⽤AddWithValue()简化代码编写量。⽅法五和⽅法⼆也
-----------------------------------------------------------------------------------------------------------------------------------------------
作者:GavinDream(GavinDream主页博客园)
出处:wwwblogs/fuchongjundream/
任何转载必须保留完整⽂章,在显要地⽅显⽰署名以及原⽂链接。如您有任何疑问或者授权⽅⾯的协商,请发邮件给我或者留⾔。
复习ADO.NET的参数查询 Parameter
1、使⽤SqlParameter类表⽰ SqlCommand 的参数。
2、SqlParameter提供两个参数,参数别名(@前缀)与参数值。
3、SqlCommand提供⼀个Parameter属性,该属性表⽰SqlParameter的集合,使⽤Add⽅法添加(记得new)。
4、Parameter属性表⽰的是⼀个集合,不使⽤了要清空。
练习,登录验证:
1class Program
2 {
3static void Main(string[] args)
4 {
5
6while (true)
7 {
8 Console.WriteLine("⽤户名");
9string name = Console.ReadLine();
10 Console.WriteLine("密码");
11string pwd = Console.ReadLine();
12
13string constr = @"server=.\sqlexpress;database=MyDataBase;uid=sa;pwd=sa";
14using (SqlConnection sqlconn = new SqlConnection(constr))
15 {
16//⽼⽅法
17//string cmdstr = string.Format(@"select * from loginn where uname='{0}' and upwd='{1}'",name,pwd);
18//参数化查询
19string cmdstr = @"select * from loginn where uname=@name1 and upwd=@pwd1";
20//@name1,@pwd1仅仅是别名⽽已,相当于局部变量
21using (SqlCommand cmd = new SqlCommand(cmdstr, sqlconn))
22 {
23//加参数
24 cmd.Parameters.Add(new SqlParameter( "@name1", name));//把name中的值赋给@name1
25 cmd.Parameters.Add(new SqlParameter("@pwd1", pwd)); //注意Add⽅法中是new了⼀个 SqlParameter 26// cmd.Parameters.AddWithValue("@pwd1", pwd);//此⽅法内部实现同Add,推荐⽤前者
27if (sqlconn.State == ConnectionState.Closed)
28 {
29 sqlconn.Open();
30 }
31
32
33if (Convert.ToInt32(cmd.ExecuteScalar()) == 1)
34 {
35 Console.WriteLine("登录成功");
36break;
37 }
38else
39 {
40 Console.WriteLine("重新输⼊");
41continue;
42 }
43 }
44
45 }
46
47 }
48 Console.ReadKey();
49 }
50 }
MySQL的参数化
C#在操作数据库的过程中,时常会将值参数化,赋给命令执⾏对象.
C#操作⼀般数据库的参数化符号都是"@",如:insert into user values(@username,@userpass).
但操作MySQL却有不⽤,参数化符号变成了"",如:insert into user values(username,?userpass);
rains
提问于:悬赏园⾖:
热⼼⽹友
提问者采纳
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/// <summary>
/// ⽤于新增记录的 SQL 语句
/// </summary>
private const String INSERT_SQL =
@"
INSERT INTO sale_report (
sale_date, sale_item, sale_money
) VALUES (
sale_date, ?sale_item, ?sale_money
)";
/// <summary>
/// 插⼊数据.
/// </summary>
/// <param name="conn"></param>
private void InsertData(MySqlConnection conn)
mysql下载starting the server{
// 创建⼀个 Command.
MySqlCommand insertCommand = conn.CreateCommand();
⽅法,表明本次操作,不是⼀个查询的操作。将没有结果集合返回 insertRowCount = insertCommand.ExecuteNonQuery();
条记录的插⼊。", insertRowCount);
因为是⼀条
使⽤参数化查询防⽌SQL 注⼊漏洞
摘要:摘要:在Web 应⽤开发过程中,SQL 注⼊漏洞是⼤家都⾮常关⼼的问题。本⽂介绍了应⽤参数化查询来解决SQL 注⼊问题。 SQL 注⼊漏洞曾经是Web 应⽤程序的噩梦,CMS 、BBS 、Blog ⽆⼀不曾受其害。
SQL 注⼊的原理
以往在Web 应⽤程序访问数据库时⼀般是采取拼接字符串的形式,⽐如登录的时候就是根据⽤户名和密码去查询:
其中userName 和password 两个变量的值是由⽤户输⼊的。在userName 和password 都合法的情况下,
这⾃然没有问题,但是⽤户输⼊是不可信的,⼀些恶意⽤户只要⽤⼀些技巧,就可以绕过⽤户名、密码登
录。
假设password 的值是"1' or '1' = '1",userName 的值随便取,⽐如是"abc",那变量sql 的值就是:
由于'1' = '1'恒为真,因此只要User 表中有数据,不管UserName 、Password 的值是否匹配,这条SQL
命令准能查出记录来。就这样,登录系统就被破解了。
以往的防御⽅式
以前对付这种漏洞的⽅式主要有三种:
字符串检测:限定内容只能由英⽂、数字等常规字符,如果检查到⽤户输⼊有特殊字符,直接拒
绝。但缺点是,系统中不可避免地会有些内容包含特殊字符,这时候总不能拒绝⼊库。
字符串替换:把危险字符替换成其他字符,缺点是危险字符可能有很多,⼀⼀枚举替换相当⿇烦,
也可能有漏⽹之鱼。
存储过程:把参数传到存储过程进⾏处理,但并不是所有数据库都⽀持存储过程。如果存储过程中
执⾏的命令也是通过拼接字符串出来的,还是会有漏洞。
参数化查询
近年来,⾃从参数化查询出现后,SQL 注⼊漏洞已成明⽇黄花。
参数化查询(Parameterized Query 或 Parameterized Statement )是访问数据库时,在需要填⼊数值
或数据的地⽅,使⽤参数 (Parameter) 来给值。
在使⽤参数化查询的情况下,数据库服务器不会将参数的内容视为SQL 指令的⼀部份来处理,⽽是在数
据库完成SQL 指令的编译后,才套⽤参数运⾏,因此就算参数中含有指令,也不会被数据库运⾏。
Access 、SQL Server 、MySQL 、SQLite 等常⽤数据库都⽀持参数化查询。
在ASP 程序中使⽤参数化查询
ASP 环境下的参数化查询主要由Connection 对象和Command 对象完成。
Access 数据库只⽀持匿名参数,在传⼊参数的位置⽤问号代替即可。SQL Server 数据库虽然⽀持匿名和⾮匿名的参数,但是在ASP 中也仅能使⽤匿名参数。
在ASP.NET 程序中使⽤参数化查询
ASP.NET 环境下的查询化查询也是通过Connection 对象和Command 对象完成。如果数据库是SQL
Server ,就可以⽤有名字的参数了,格式是“@”字符加上参数名。
作者: seasun 发布时间: 2010-09-26 15:27 阅读: 5961 次 推荐: 4 原⽂链接 [收藏]
1string sql = "SELECT TOP 1 * FROM [User] WHERE UserName = '" + userName + "' AND Password = '" +
password + "'";
1"SELECT TOP 1 * FROM [User] WHERE UserName = 'abc' AND Password = '1' or '1' = '1'"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16var conn = Server.CreateObject("ADODB.Connection");conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("Test.mdb");conn.Open(); 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();
[sql]
01. select name,id from user where id=@id
[sql]
01. select name,id from user where id=?id
[csharp]
01. SqlParameter param = new SqlParameter("id", SqlDbType.Int);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论