黑马程序员技术交流社区

标题: SQL查询问题 [打印本页]

作者: 丁官林    时间: 2012-4-18 21:31
标题: SQL查询问题
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+"'";
这三种的具体差别是什么?
作者: 周俊辉    时间: 2012-4-19 09:58
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);


复制代码

作者: 刘建法    时间: 2012-4-19 13:10
一般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) 来给值。这样就避免了这种情况的发生!






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2