• 参数化SQL语句


    在刚弄好登录的时候,姐夫帮忙看了后,提醒我有漏洞,我也想起了以前老师也讲过的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 = new SqlCommand(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 = new SqlDataAdapter(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             }
  • 相关阅读:
    C#几种截取字符串的方法小结
    KinSlideshow参数设置说明
    WinForm程序中两份mdf文件问题的解决
    全国省市数据库
    ASP.NET项目中使用CKEditor +CKFinder 实现上传图片
    mht文件无法打开的解决办法
    Non-parametric tests
    Plot transpant lines in Matleb 在Matlab中绘制透明线条
    Which HRV method to use: FFT or Autoregressive?
    SPM How-tos SPM预处理及统计分析指南
  • 原文地址:https://www.cnblogs.com/bkycjj/p/2984452.html
Copyright © 2020-2023  润新知