SqlDataAdapter 的注入疑问

风寒晓 2013-05-21 05:18:44
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#,谢谢大家不吝赐教。
...全文
167 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
coobai 2013-05-22
  • 打赏
  • 举报
回复
select * from userInfo where uname='' 你传 1=1;delete from test1 得到 select * from userInfo where uname='1=1;delete from test1' 你觉得这个语句会怎么执行。
风寒晓 2013-05-21
  • 打赏
  • 举报
回复
引用 8 楼 rayyu1989 的回复:
like '%'+@value+'%'
不行,参数化查询会将这个视为 字符串。 自己解决了: sqldata.SelectCommand.Parameters.Add("@MC001", SqlDbType.VarChar,22).Value ="%"+ph1.Text.ToString().Trim()+"%"; 之前没搞定这个问题是因为 数据表的字段类型是char,所以 写成 SqlDbType.Char,而参数化查询会自动填充20位长度,所以查不出来数据,改成varChar,再清掉左右空格即可实现参数化模糊查询。 这个问题困扰我半年了,终于解决了。
rayyu1989 2013-05-21
  • 打赏
  • 举报
回复
like '%'+@value+'%'
风寒晓 2013-05-21
  • 打赏
  • 举报
回复
引用 6 楼 showyusy 的回复:
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的所有行都被删除了
感谢!惨了。 再问一个问题,参数化 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()+"%" 也不行。
爱在今世 2013-05-21
  • 打赏
  • 举报
回复
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的所有行都被删除了
爱在今世 2013-05-21
  • 打赏
  • 举报
回复
你这么写:1=1';delete from test1--
风寒晓 2013-05-21
  • 打赏
  • 举报
回复
引用 3 楼 viki117 的回复:
string commString = string.Format("select * from userInfo where uname=@uname"); 在给SqlDataAdapter的SelectCommand添加参数,并把textBox1.text的值赋给它,基本上OK了...
你说的我明白啊,用参数化命令。
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 是不是没有注入危险,或者是我理解还不够透彻。
viki117 2013-05-21
  • 打赏
  • 举报
回复
string commString = string.Format("select * from userInfo where uname=@uname"); 在给SqlDataAdapter的SelectCommand添加参数,并把textBox1.text的值赋给它,基本上OK了...
爱在今世 2013-05-21
  • 打赏
  • 举报
回复
引用 1 楼 showyusy 的回复:
貌似你的sql语句写错了delete from test1这一句都不能通过
好吧,是我看错了。。。。
爱在今世 2013-05-21
  • 打赏
  • 举报
回复
貌似你的sql语句写错了delete from test1这一句都不能通过

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧