首页 > 编程知识 正文

mysql sql语句 参数化参数化SQL语句,sql语句注入参数

时间:2023-05-04 15:48:39 阅读:215311 作者:4359

在刚弄好登录的时候,wjdgb帮忙看了后,提醒我有漏洞,我也想起了以前老师也讲过的SQL注入,例如

string sql = string.Format("SELECT COUNT(*) FROM demoUsers WHERE UserName='{0}' AND UserPassword = '{1}'",

textBox1.Text.Trim(), textBox2.Text.Trim());

那么可以在登录框中输入:XXX' or 1==1--,这边是漏洞,于是就有了接下来参数化sql语言的修改。

1 //新建查询语句

2 string sql = string.Format("SELECT COUNT(*) FROM demoUsers WHERE UserName=@UserName AND UserPassword = @UserPassword");3 SqlCommand command = newSqlCommand(sql, sqlHelp.connection);4 //打开数据库连接

5 sqlHelp.connection.Open();6 command.Parameters.AddWithValue("@UserName", textBox1.Text.Trim()); //参数化Sql语句

7 command.Parameters.AddWithValue("@UserPassword", textBox2.Text.Trim());8 num = Convert.ToInt32(command.ExecuteScalar());//执行查询并返回查询结果

此上是自己的一个例子,那么是查询本数据库中而不是用户输入的便是下面此法:

例如我们在本篇中创建的表UserInfo中查找所有女性用户,那么通常情况下我们的SQL语句可能是这样:

select * from UserInfo where sex=0

在参数化SQL语句中我们将数值以参数化的形式提供,对于上面的查询,我们用参数化SQL语句表示为:

select * from UserInfo where sex=@sex

再对代码中对这个SQL语句中的参数进行赋值,假如我们要查找UserInfo表中所有年龄大于30岁的男性用户,这个参数化SQL语句可以这么写:

select * from UserInfo where sex=@sex and age>@age

下面是执行这个查询并且将查询结果集以DataTable的方式返回的代码:

1 //实例化Connection对象

2 SqlConnection connection = new SqlConnection("server=localhost;database=pubs;uid=sa;pwd=''");3 //实例化Command对象

4 SqlCommand command = new SqlCommand("select * from UserInfo where sex=@sex and age>@age", connection);5 //第一种添加查询参数的例子

6 command.Parameters.AddWithValue("@sex", true);7 //第二种添加查询参数的例子

8 SqlParameter parameter = new SqlParameter("@age", SqlDbType.Int);//注意UserInfo表里age字段是int类型的

9 parameter.Value = 30;10 command.Parameters.Add(parameter);//添加参数11 //实例化DataAdapter

12 SqlDataAdapter adapter = newSqlDataAdapter(command);13 DataTable data = new DataTable();

上面的代码是访问SQL Server数据库的代码。如果本文中提到的数据分别在Access、MySQL、Oracle数据库,那么对应的参数化SQL语句及参数分别如下:

数据库

Access

MySQL

Oracle

SQL语句

select * from UserInfo

where sex=? and age>?

select * from UserInfo

where sex=?sex and age>?age

select * from UserInfo

where sex=:sex and age>:age

参数

OleDbParameter

MySqlParameter

OracleParameter

实例化参数

OleDbParameter p=new OleDbParameter(“?”, OleDbType. Boolean);

MySqlParameter p=new MySqlParameter(“?sex”, MySqlDbType.Bit);

OracleParameter p=new OracleParameter(“:sex”, OracleType.Byte);

赋值

p.Value=true;

p.Value=1;

p.Value=1;

参考来源:http://www.cnblogs.com/aito/archive/2010/08/25/1808569.html

http://www.cnblogs.com/lzrabbit/archive/2012/04/21/2460978.html

每天小知识点归纳:

1.数据库有bit类型,可记录性别true与false.在运用中也就是1.0。

2.命名空间跨文档引用的时候记得命名空间的using。

3.catch的使用,可以在前面定义error,之后后面的判断可以为if(num ==1&&error==false)

1 try

2 {3 //新建查询语句4 //打开数据库连接

5 catch(Exception ex)6 {7 MessageBox.Show(ex.Message );8 }9 finally

10 {11 sqlHelp.connection.Close();12 }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。