A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 丁官林 中级黑马   /  2012-4-18 21:31  /  1752 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

cmd.command="select count(*) from UserInfo where username=@UN and pwd=@WD";
cmd.Parameters.Add(new sqlParameter("UN",username));
cmd.Parameters.Add(new sqlParameter("WD",pwd));
这种可以避免注入漏洞,那下面这种可以吗?

string sql=string.Format("select count(*) from UserInfo where username='{0}' and pwd='{1}'",username,pwd);
cmd.command(sql);

cmd.commandtext="select count(*) from UserInfo where username=‘“+username+”‘“+”and pwd='"+pwd+"'";
这三种的具体差别是什么?

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

2 个回复

倒序浏览
string sql=string.Format("select count(*) from UserInfo where username='{0}' and pwd='{1}'",username,pwd);
cmd.command(sql);

cmd.commandtext="select count(*) from UserInfo where username=‘“+username+”‘“+”and pwd='"+pwd+"'";
这三种的具体差别是什么?

从表面上来看是多了一个String.Format 是将指定的 String类型的数据中的每个格式项替换为相应对象的值的文本等效项。

个人感觉应该是没有什么区别的。 我举个例子你看下

  1. string p1 = "Jackie";

  2. string p2 = "Aillo";

  3. Response.Write(String.Format("Hello {0}, I'm {1}", p1, p2));
  4. Response.Write(“Hello" +p1,+"I'm "+ P2);


复制代码

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
一般SQL注入就是用户通过客户端请求GET或POST方式将SQL语句提交到服务端,欺骗服务器去执行恶意的SQL语句, 就像你写的那样 后两种效果应该差不多就拿 cmd.commandtext="select count(*) from UserInfo where username=‘“+username+”‘“+”and pwd='"+pwd+"'";
来说把 其中username和pwd两个变量的值是由用户输入的。要是用户输入的userName和pwd都合法的情况下,那绝对没有问题,但是 用户输入的是我们想不到的,一些恶意用户只要用一些技巧,就可以绕过用户名、密码登录。
就像:在网站上随意找个用户名"dream" 那要是pwd='a'='a',上面的查询语句不就是恒等式了吗,所以为了避免这样的事情发生 .net中提供了在需要填入数值或数据的地方,使用参数 (Parameter) 来给值。这样就避免了这种情况的发生!

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马