什么是SQL注入啊。。网上看了半天,还是不明白,能否帮举个例子,说的通俗点,谢谢!!

vincevincevincevince 2008-12-22 04:35:08
什么是SQL注入啊。。网上看了半天,还是不明白,能否帮举个例子,说的通俗点,明白点,谢谢!!
...全文
499 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ailin84 2008-12-23
  • 打赏
  • 举报
回复

比如,我要知道你的sql数据库用户名
http://www.100.com/news.aspx?id=49 and user>0
程序会报错:将nvarchar值 ”sa” 转换数据类型为 int 的列时发生语法错误
ok,攻击者知道你的数据库用户名了(sa)
user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错
SQLServer的用户sa是个等同Adminstrators权限的角色,拿到了sa权限,你这台主机我都能控制了

再比如我想知道你的管理员表的名字:
http://www.100.com/news.aspx?id=49 and (Select count(*) from admin)>0
如果页面不出错,那么我就知道你的管理员表是admin这个表了

大概知道怎么防范sql注入了吧

1.sql语句尽量写成参数形式 select * from news where id=@id
2.如果用字符串连接的方式写sql语句,那么最好对输入参数做必要的验证
string sql="select * from news where id="
sql+= int.Parse(Request.QueryString("id").toString()).toString();




llsen 2008-12-22
  • 打赏
  • 举报
回复
就是输入画面,别人输入一些字符破坏你sql语句的完整性来达到别人的目的。

比如你写的"select * from table where id in('"+textbox1.text+"')";

你想的事1,2
别人可能输入1’,'2') or 1=1 or in('
那你的where条件就改变了
tian_fang 2008-12-22
  • 打赏
  • 举报
回复
学习
anncesky 2008-12-22
  • 打赏
  • 举报
回复
"select * from books where bookid="+id

像这样的句子如果你的id值是来自表单或者查询字符串时,别人输入

" 1;delete books where bookid=1 "

那么合起来的sql句子就是

select * from books where bookid=1;delete books where bookid=1

执行之后会有什么后果吗??
  • 打赏
  • 举报
回复
long dt= DateTime.Parse(yourTextBox.Text);
-->
DateTime dt= DateTime.Parse(yourTextBox.Text);
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jiang_jiajia10 的回复:]
一般我们在写in条件查询的时候
写法如下:
select * from contactcomp where companyid in(80522010000128585,80312010000093905)
in的条件是由界面传进来的,那么这样就存在着sql注入了,注入方法如下:
select * from contactcomp where companyid in(80522010000128585,80312010000093905);select * from userinfo;--)
这只是一个例子,大家可以发挥。利用这个漏洞,我们可以做很多操作。
所以凡是有where条件的,…
[/Quote]

我引用这个例子,在你接受用户录入的地方,与你真正执行查询的地方,应该至少有一个明确地表达参数类型的代码。例如,中间某个环节,你应该有类似

long id= long.Parse(yourTextBox.Text);

的代码,而查询则是

string sql="select * from contactcomp where companyid in("+id.ToString()+")";

也就是说,对于非字符串,在查询之前要使用强类型的变量来保存(而不是字符串)。而对于字符串,要将单引号替换为两个单引号。只有这样,你才能编写出符合sql语法的的代码。否则,如果你直接把一个yourTextBox.Text或者一个字符串变量直接拼接入sql,这个字符串中可以包括任何字符,你怎么知道这个字符串符合sql语法呢?

同样地,如果需要一个DateTime类型的变量拼接入sql,那么你需要首先

long dt= DateTime.Parse(yourTextBox.Text);

既事先将字符串转换为日期然后再按照日期在SQL中的格式拼接sql变量时将dt转换为相应的格式,这是很多人都知道的!但是,粗心大意的人将一个字符串随便拼接入原本需要整数的SQL语句部分,而并没有事先将这个字符串转换为整数然后再按照整数在SQL的格式拼接进去,这是很多人犯的毛病。

如果你是一个稍微专业一点的数据库编程人员,你在得到由字符串所代表的一个整数然后拼接到SQL语句时,如果首先考虑到结果是否符合SQL语法(考虑到不符合语法的任意一种可能性,而不比考虑SQL注入),你就已经早已把此类地方的所谓“SQL注入”扔到九霄云外根本上海不到你了。

所以,写此类程序时首先考虑SQL语法,考虑你是否连一个基本的数据库编程素质都没有养成,而网上热炒“什么是SQL注入啊。。网上看了半天,还是不明白”只是此类素质没有养成的一个讽刺。
chaobeyond 2008-12-22
  • 打赏
  • 举报
回复
http://www.qeqoo.com/dev/database/dbms/1275.html
http://www.qeqoo.com/dev/database/dbms/508.html
lovehongyun 2008-12-22
  • 打赏
  • 举报
回复
string sql = "select * from table1 where username = '' or ''='' and pwd = '' or ''='' ";
zhuxianzhu 2008-12-22
  • 打赏
  • 举报
回复
先学点简单的吧,1个月后再来问
jiang_jiajia10 2008-12-22
  • 打赏
  • 举报
回复
一般我们在写in条件查询的时候
写法如下:
select * from contactcomp where companyid in(80522010000128585,80312010000093905)
in的条件是由界面传进来的,那么这样就存在着sql注入了,注入方法如下:
select * from contactcomp where companyid in(80522010000128585,80312010000093905);select * from userinfo;--)
这只是一个例子,大家可以发挥。利用这个漏洞,我们可以做很多操作。
所以凡是有where条件的,都要我们组织sql语句,要过滤用户输入的条件。比如上面我们就可以以long[]作为参数代替字符串,然后自己将long[]连接成字符串再进行查询。

LIke的条件查询也是一样的做法。
Select * from contactcomp where name like '%' and 1=1 and '%'='%'
Select * from contactcomp where name like '%name%'

r_swordsman 2008-12-22
  • 打赏
  • 举报
回复
这个对你可能太难了..先学点简单的吧

62,269

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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