string commString = string.Format("select * from userInfo where uname='"+textBox1.text+"' ");
SqlDataAdapter sqldata = new SqlDataAdapter(commString, con);
 DataTable datatable1 = new DataTable();
sqldata.Fill(datatable1);
    请教各位大神,以上语句是否存在被SQL注入的危险。
    我自己直接在 textBox1 里输1=1;delete from test1;没有注入效果。难道是SqlDataAdapter 只填充数据,不执行 ExecuteNonQuery 类似的命令么,也就是说像这样的sqldata.Fill(datatable1)填充 是不会有注入危险的?
    自学C#,谢谢大家不吝赐教。SqlDataAdapter 的注入疑问C#sql注入

解决方案 »

  1.   

    貌似你的sql语句写错了delete from test1这一句都不能通过
      

  2.   

    string commString = string.Format("select * from userInfo where uname=@uname");在给SqlDataAdapter的SelectCommand添加参数,并把textBox1.text的值赋给它,基本上OK了...
      

  3.   

    你说的我明白啊,用参数化命令。
    string cmdStr = "select * from USERINFO where USERS=@uname and PWD=@upwd";
                        SqlCommand cmd = new SqlCommand(cmdStr, con);
                        cmd.Parameters.Add("@uname", SqlDbType.Char,10).Value = this.username.Text.ToString();
                        cmd.Parameters.Add("@upwd", SqlDbType.Char,10).Value = this.userpwd.Text.ToString();
                        SqlDataReader reader = cmd.ExecuteReader();
    关键是 我想 知道 SqlDataAdapter 是不是没有注入危险,或者是我理解还不够透彻。
      

  4.   

    你这么写:1=1';delete from test1--
      

  5.   

    string gongji="1=1';delete from test--";
                SqlConnection con = new SqlConnection("database=test;server=localhost;User id=sa;password=密码");
                con.Open();
                string sql = "select * from test where username='" + gongji + "'";
                SqlDataAdapter sda = new SqlDataAdapter(sql, con);
                DataSet ds = new DataSet();
                sda.Fill(ds);
                con.Close();
                if (ds != null)
                {            }以上代码亲测的结果是,表test的所有行都被删除了
      

  6.   

               感谢!惨了。
               再问一个问题,参数化 WHERE MC001 like @MC001 
               sqldata.SelectCommand.Parameters.Add("@MC001", SqlDbType.Char,22).Value =ph1.Text.ToString().Trim();
               类似这样的like 语句如何写啊,像SQL 那样的 like '%@MC001%' 查不到任何数据,用"%"+ph1.Text.ToString().Trim()+"%" 也不行。
      

  7.   

     不行,参数化查询会将这个视为 字符串。
    自己解决了:
    sqldata.SelectCommand.Parameters.Add("@MC001", SqlDbType.VarChar,22).Value ="%"+ph1.Text.ToString().Trim()+"%"; 
    之前没搞定这个问题是因为 数据表的字段类型是char,所以 写成 SqlDbType.Char,而参数化查询会自动填充20位长度,所以查不出来数据,改成varChar,再清掉左右空格即可实现参数化模糊查询。
    这个问题困扰我半年了,终于解决了。
      

  8.   

    select * from userInfo where uname=''
    你传 1=1;delete from test1
    得到
    select * from userInfo where uname='1=1;delete from test1' 你觉得这个语句会怎么执行。