【发布时间】:2015-08-05 18:57:20
【问题描述】:
我正在处理从sys.database 主表构建表名列表的查询。然后,我在 concat 语句中使用这些名称来从每个数据库中提取特定的信息。我正在通过一个 while 循环运行整个事情,以使用计数器来命中所有表。
即
set @sql = 'select top 10 * from ' + (select dbname from @table where tabid = @i + '.dbo.**tablename** where NAME = '**String Value**'
当我只是print@sql 的结果时,它给了我正确的语法,我可以毫无问题地运行命令。
当我将@sql 设置为exec 时,出现错误
“从 dbname 中选择的前 10 个数据库 * 不存在。”
就像执行忽略了选择之后的所有内容。
【问题讨论】:
-
@TrippKinetics,这并不是真正的 sql 注入问题 - 他在 SSMS 之类的东西中完成了这一切。 Gregory,你能发布所有相关的代码吗?您只发布了一行的一部分,不足以说明实际情况。
-
@TrippKinetics 他正在构建动态 SQL。你不能参数化表名。
-
@DanField:如果连接中使用的任何值来自用户输入,则它可以是 SQL 可注入的。无论代码在哪里执行,如果用户提供或在任何时候有机会更改该值,则应将其视为一个值,而不是可执行代码的一部分。
-
是的,我的意思是说我假设他这样做是一项管理任务,而不是基于(非管理员)用户输入的任务。例如,我已经做了这样的事情来动态构建插入/创建语句 - 意味着在设计过程或其他东西时一次性使用。
-
@GregoryWallace,你可以看看
sp_msforeachtable函数
标签: sql sql-server