请教个关于SqlParameter的初级问题。
在ASP.NET中,以前一直用
new SqlParameter("@pwd",pwd)
;但是有前辈说不能用这种写法,这样和
select id from users where pwd = '+pwd+'
没什么两样,不能防止 SQL 注入,于是我自己又写了个简单的程序测试了一遍,没发现
new SqlParameter("@pwd",pwd)
这种写法能 SQL 注入啊,难道这种写法不能防止 SQL 注入?纳了闷了,求高人指点。
------最佳解决方案--------------------个人认为楼主的写法已经可以了,声明了参数以后,就是加了‘什么的符号,SQL SERVER 也是把它当成参数,而不会当成是SQL命令的一部分。当前最好是加上类型限定,长度什么的最舒服了。不过前辈嘛,你知道的,要多敬重,要多学习,一点点小事情不用这么较真。
------其他解决方案--------------------string sql = "select ID from users where pwd = @pwd";
SqlDataReader sdr = SqlHelper.ExecuteReader(conn,CommandType.Text,sql,new SqlParameter("@pwd",pwd));
这就是参数化查询了,这样做pwd里面不管是什么,数据库都把它当成一个参数,而不是查询结构的一部分。
------其他解决方案--------------------也许是你前辈在想着其他的技术点,随口这么一说..
------其他解决方案--------------------1、反正我觉得LZ是正确的。
2、个人从来不管注入不注入的,完全交给sql防注入硬件,还有usb-key,注入不注入懒的去管。
------其他解决方案--------------------楼主这样写,应该是正确的,你们前辈应该是让你加上类型等等的限制吧 、我就是用sql参数哇。没听过这种方式还跟字符串拼接一样的。应该是你听错啦。
------其他解决方案--------------------我操,楼上多少人不看问题就回答啊。。。。我觉得楼主前辈是SB
------其他解决方案--------------------用参数,别用拼接,拼接很容易被注入的
------其他解决方案--------------------new SqlParameter("@pwd",pwd)
这种写法比拼接好
------其他解决方案--------------------传参更好 更不容易被注入
而且 你用拼接的时候 正常的非注入数据 有可能会遇到传过来的有"'" 造成执行失败
------其他解决方案--------------------new SqlParameter("@pwd",pwd);
select id from users where pwd = @pwd;//执行这个sql才叫带参数的,你那样还是拼接字符串
------其他解决方案--------------------想更严格一些可以在参数中加上长度,类型等限定,也许前辈是这个意思。
------其他解决方案--------------------
我就是这样写的:
string sql = "select ID from users where pwd = @pwd";
SqlDataReader sdr = SqlHelper.ExecuteReader(conn,CommandType.Text,sql,new SqlParameter("@pwd",pwd));
------其他解决方案--------------------
嗯,对,我想他应该是这个意思吧,但是也不能说以前的那种写法不能防止 SQL 注入啊,除非他以前注入成功过。
------其他解决方案--------------------
我就是用的参数,
string sql = "select ID from users where pwd = @pwd"; SqlDataReader sdr = SqlHelper.ExecuteReader(conn,CommandType.Text,sql,new SqlParameter("@pwd",pwd));