SqlParameter是怎么防止SQL注入的?

sandheart 2011-09-08 05:39:04
例如:我把一个值“aa' or 1=1”这样的值通过SqlParameter传递时,执行时就不会出错,而且还能防注入,但我想知道把值传给了SqlParameter后,它传给SQl的是什么值,什么的什么方法转换的。
谢谢
...全文
597 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
THG8888 2011-09-09
  • 打赏
  • 举报
回复
delcare @str varchar(100)
set @str = 'xxxx--;delete from tb'
select * from tb where col = @str
------
declare @sql varchar(100)
set @sql = 'select * from tb where col='''+@str+''''
exec(@sql)
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wnyxy 的回复:]
stirng nn="aa or 1=1";
"select * from tb where t1='"+nn+"'";


//防注入
"select * from tb where t1=@N";
cmd.Parameters.Add(new SqlParameter(@N,aa or 1=1));
[/Quote]
引用哈这位哥们的哈。其实原理很简单,@是C#中强制转换符吧(不是专业术语),@String 的意思是,String里的所有符号都是其符号意思,不存在任何特殊意义。例如String里有“或者‘,其本意就是’,不会把它当成 sql语句里的‘,我们常规的sql操作语句当中一般会是这样
string StuName=TextBox1.Text;
string str="select * from StudentInfo where stuName='"+StuName+"'";
StuId是别人来输入的。假设我输入的格式为StuName是 ' and stuid='12
那么连起来 str=select * from StudentInfo where stuName='' and stuid='12'
当然输入的不可能是多加个where判断条件,万一是删除呢?这个就是sql注入产生的原因。
如果
string str="select * from StudentInfo where stuName='"+@StuName+"'";
这样的话 sql注入就没办法了。因为它会因为有@把StuName里的东西当成一个整体,一个字符串没有任何特殊意义,'就失去sql语句的意义。
这个是我个人目前理解,有错的地方,大家可以说说。
上面代码随意打的,没有vs测式,只是表示一个意思。
萧炎 2011-09-09
  • 打赏
  • 举报
回复
LZ这个列子对sql注入将的很详细
点此进入
挨踢直男 2011-09-09
  • 打赏
  • 举报
回复
sql 中不是有这种写法吗

delcare @str varchar(100)
set @str = 'xxxx--;delete from tb'
select * from tb where col = @str
------
declare @sql varchar(100)
set @sql = 'select * from tb where col='''+@str+''''
exec(@sql)


这以经不是直接执行一个字符串了
估计运行方式有所区别
就如同javascript中的
eval("alert(1)")
或者
alert(1)
差不多道理吧
波波007 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wnyxy 的回复:]
引用 3 楼 wnyxy 的回复:
第一句

select * from tb where t1='aa' or 1=1

第二句

select * from tb where t1='aa or 1=1'


第二句

select * from tb where t1='aa' or 1=1'
[/Quote]

呵呵!!典型登录注入。
hao1hao2hao3 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 sandheart 的回复:]
例如:我把一个值“aa' or 1=1”这样的值通过SqlParameter传递时,执行时就不会出错,而且还能防注入,但我想知道把值传给了SqlParameter后,它传给SQl的是什么值,什么的什么方法转换的。
谢谢
[/Quote]

用的是什么数据库?可以用数据库的跟踪工具(MS SQL Server的为SQL Server Profiler)来看看数据库中执行的是什么语句。
NBDBA 2011-09-09
  • 打赏
  • 举报
回复
用.net里的SqlParameter对象防注入的关键是你不要拼接sql语句,把sql语句的可变部分参数化。这是总的思想,违反这个,就算你用.net里的SqlParameter对象,但是你的参数是直接拼接sql语句执行的,也一样可以注入
querystringcom 2011-09-09
  • 打赏
  • 举报
回复
用@参数就行了
sandheart 2011-09-09
  • 打赏
  • 举报
回复
是不是只把字符串里的半角单引号全转换成两个半角单引号,然后再在两端加半角单引号?
remember_me 2011-09-09
  • 打赏
  • 举报
回复
利用参数化查询是防止SQL恶意注入的有效方法。

避免用参数直接拼SQL语句。
编程有钱人了 2011-09-08
  • 打赏
  • 举报
回复
把所有传入的 东西 当 字符串来处理 而不是 关键字
就是这个么回事
wnyxy001 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wnyxy 的回复:]
第一句

select * from tb where t1='aa' or 1=1

第二句

select * from tb where t1='aa or 1=1'
[/Quote]

第二句

select * from tb where t1='aa' or 1=1'

wnyxy001 2011-09-08
  • 打赏
  • 举报
回复
第一句

select * from tb where t1='aa' or 1=1

第二句

select * from tb where t1='aa or 1=1'
wnyxy001 2011-09-08
  • 打赏
  • 举报
回复
stirng nn="aa or 1=1";
"select * from tb where t1='"+nn+"'";


//防注入
"select * from tb where t1=@N";
cmd.Parameters.Add(new SqlParameter(@N,aa or 1=1));

110,561

社区成员

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

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

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