[转]在存储过程中拼接SQL语句
我常常在网络上看到很多存储过程的例子里面基本都是拼接一个或多个SQL然后用EXEC运行
例如:
.....
@strsql='update table_name set a='''+ @a +''' where id='+@id
exec (@strsql)
==================================================================
而不是直接:
......
update table_name set a=@a where id=@id
======================================================================
对于在存储过程中拼接SQL我认为:
1。很容易存在注入漏洞
2。存储过程是预编译的,在存储过程中拼接SQL就意味着SQL语句在运行的时候才生成,也就是说在运行的时候才对其解释执行,这样的活预编译就好象没有意义了
3。能够不拼接就不拼接
以上的观点对不对呢?
也存在这样的问题:如果不使用拼接SQL有些时候会加大存储过程的复杂度或者需要增加参数,两者之间应该如何取舍呢?
除了能简化程序以外,在存储过程中拼接SQL还有什么好处吗?
----------------------------------------------------------------------------------
#18
想不被注入,那就需要:
1.把sql 示例数据库删除.
2.把用不到的系统存储过程删除.
3.使用最小特权帐号登录数据库,尽量不要用sa帐号,并设sa帐号强密码,并定期修改密码.sa帐号只在万一需要管理数据库时,使用企业管理器才用.但不要用到程序中.
4.删除不用的多余的odbc驱动程序.只保留你常用到的.
5.转义,过滤危险字符' --等.拒绝sql 攻击签名: drop, delete, insert, update
6.尽量使用command.
7.select id, name from 表. 尽量不要使用select * from 表这样的形式.
8.对参数进行异常捕捉.
.......
[原文地址]http://bbs.csdn.net/topics/100073432

浙公网安备 33010602011771号