【发布时间】:2014-01-15 09:32:39
【问题描述】:
我知道动态 SQL 永远不应该是第一选择,相信我它不是,但它现在正在起作用,我想找到一种方法,至少提供某种针对 SQL 注入的保护,任何东西总比没有好对吧?顺便说一句,我确实搜索了相关问题并找到了一堆,但没有使用 SQL Server 上的 SP。
在这个应用程序中需要动态 SQL 的原因是因为程序可以执行几个存储过程,但是它们可以从不同的数据库中选择信息,我们不知道它们将被命名为什么。我们确实知道这些数据库的名称将位于另一个数据库中,这就是用户部署以前系统的方式。
因此,当用户运行应用程序时,它会向他显示他可以访问的数据库,当他选择一个时,存储过程会通过动态 SQL 与所选数据库一起执行。
起初我以为唯一可以动态使用的参数是数据库,但看看参数是如何发送的,显然它们都是动态的,看看这个例子:
CREATE PROCEDURE testProc @myDatabase varchar(30), @myMonth varchar(10)
AS
BEGIN
DECLARE @sql nvarchar(1000)
SET @sql = 'SELECT * FROM '+@myDatabase+'.dbo.myTable WHERE Month='+@myMonth+''
EXECUTE sp_executesql @sql
END
现在这个应用程序将主要被那些最有可能不想放弃自己的数据库的人使用,但是他们将获得的选项将受到限制该应用程序允许他们创建更多字段来过滤数据,如果他们愿意,他们可以在这里或那里删除 drop。我不是说他们会,但它可能会发生,那么有没有办法让我至少从过程创建本身更安全一点?
【问题讨论】:
-
已经回答,请看这里:stackoverflow.com/questions/1246760/…
-
@RBarryYoung 公平地说,它看起来像是对不同问题的相同答案:)
标签: sql-server-2008 stored-procedures sql-injection dynamic-sql