日期:2014-05-17  浏览次数:20848 次

sql="DECLARE @var varchar;select @var='"&id&"';SELECT * FROM dbo.TR_Template where name=@var;":rs.open sql,conn,1,1这段代码有不
由使用存储过程防注入想到的.
如果不使用存储过程,而使用类似上面的方式来执行sql语句,也存在注入风险吗?还是达到了和存储过程一样的安全性?
另外就一下,与单独执行SELECT   *   FROM   dbo.TR_Template   where   name= ' "&id& " ' "这样的语句相比,性能上的损失大吗?

------解决方案--------------------
sql= "DECLARE @var varchar;select @var= ' "&id& " ';SELECT * FROM dbo.TR_Template where name=@var; ":rs.open sql,conn,1,1

这个当然存在注入危险,因为无论sql这个变量里面的语句如何写,都是做为一个字符串提交到DB服务器执行.
你的意思我大概了解,不是你这种写法啊,不使用存储过程应该是这样的:

SET Cmd = Server.CreateObject( "ADODB.Command ")
With Cmd
.ActiveConnection = connstirng '数据库连接字符串
.CommandText = "SELECT * FROM dbo.TR_Template where name=? "
.CommandType = adCmdText
.Parameters.Append .CreateParameter( "@id ",adVarChar,,50,id)
SET rs = .Execute
End With
SET Cmd = Nothing


------解决方案--------------------
sql= "DECLARE @var varchar;select @var= ' "&id& " ';SELECT * FROM dbo.TR_Template where name=@var; ":rs.open sql,conn,1,1
貌似不能防止注入攻击样~!


SELECT * FROM dbo.TR_Template where name= ' "&id& " ' "
人家在输入 1 'or '1 '= '1 到密码框的时候,还不是把1 'or '1 '= '1当一个字符串就带进去了~!
正确的方法是 trim(Replace(password, " ' ", " "))

而且 "DECLARE @var varchar;select @var= ' "&id& " ';SELECT * FROM dbo.TR_Template where name=@var; "这条SQL语句只有在SQl Server上使用吧!
加分号的多语句SQL,是不能在Access上使用的!

------解决方案--------------------
CodeCatcher() ( ) 信誉:100 的方法很好~!

使用这个指定类型的参数,在执行SQL的时候是并不是执行带有 ' ' 的SQL语句。所以就可以防止SQL注入了。这种方法应该更加安全!

------解决方案--------------------
同意
这种方法应该是用1楼的
------解决方案--------------------
是啊,安全性一样