黑马程序员技术交流社区

标题: 防止SQL注入? [打印本页]

作者: 蔡军    时间: 2012-3-24 00:10
标题: 防止SQL注入?
上次看了杨老师的视屏上那个防止SQL注入,自己还不太清楚,谁能再跟我解释一下什么是SQL注入,应该如何防止啊?能举例说明更好,谢谢啦!
作者: 曾晓文    时间: 2012-3-24 00:37
sql注入是由于拼接sql语句引起的。如你的sql语句的条件是不确定的(where部分),需要用户输入来确定的。你可以通过字符串拼接的方式实现。但是,这拼接的方式涉及到条件部分时,就不安全了。如select * from where user=@user;别人就可以给user赋上“xxx or 1=1”使语句永远为真。所以,涉及到条件部分不要拼接。
作者: 孙树迁    时间: 2012-3-24 01:01
本帖最后由 孙树迁 于 2012-3-24 01:03 编辑

今天晚上,刚学了,很好理解,重点是,那个SQL语句,
select count(*) from where username='"+ name +"' and password='"+ pass +"'
正常情况是:
用户输入:admin 8888
select count(*) from where username='admin' and password='888888'

如果用户输入:admin 1' or  '1'='1 SQL 语句就变成,(888888 换成1' or  '1'='1)
select count(*) from where username='admin' and password='1' or  '1'='1' 这个SQL语句,
你运行这个,就读出二个记录。
  1.               

  2.                 //第三种,最佳方式。
  3.                 using(SqlCommand cmd = conn.CreateCommand())
  4.                 {
  5.                     cmd.CommandText = "select count(*) from T_Users where username=@uname and password=@pwd";
  6.                     cmd.Parameters.Add(new SqlParameter("uname",name));
  7.                     cmd.Parameters.Add(new SqlParameter("pwd", pass));
  8.                     int i = Convert.ToInt32(cmd.ExecuteScalar());
  9.                     if (i > 0)
  10.                     {
  11.                         Console.WriteLine("登陆成功!");
  12.                     }
  13.                     else
  14.                     {
  15.                         Console.WriteLine("登陆失败,用户名或密码错误。");
  16.                     }
  17.                 }
  18.             
  19.             
  20.          
复制代码
这样写,就可以防止SQL注入了。
作者: →篱誸de~箭    时间: 2012-3-24 01:18
Parameters这个属性可以把你传入的值直接和数据库里的值进行比较。
作者: 方辉    时间: 2012-3-24 10:36
其实,就是防止别人把他输入的东西当成了SQL语句。。。
作者: 许前刚    时间: 2012-3-25 15:25
我的具体看法请参见我的博客:http://www.cnblogs.com/xu-qian-gang/archive/2011/11/24/2262250.html




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