.NET/SQL中的参数化表名?

Dam*_*ien 10 .net sql sql-server parameters

正如主题所示,我希望能够使用.NET(实际上与哪种语言无关)和SQL Server将表名作为参数传递.

我知道如何为值,例如做这个command.Parameters.AddWithValue("whatever", whatever)@whatever在查询中表示参数.问题是我希望能够在查询的其他部分(例如列和表名)中执行此操作.

这不是一个理想的情况,但它是我必须使用的,它不太容易SQL注入,因为只有使用代码的人可以设置这些表名而不是最终用户.但它很乱.

那么,我问的可能是什么?

编辑:为了明确说明SQL注入,表格名称仅由源代码传递,具体取决于具体情况.开发人员指定了这一点.开发人员无论如何都可以访问数据库层,所以我问的原因不是安全性,而是为了使代码更清晰.

Mar*_*ell 6

您无法直接参数化表名.您可以通过sp_ExecuteSQL间接执行此操作,但您也可以在C#中构建(参数化)TSQL(连接表名但不连接其他值)并将其作为命令发送.您获得相同的安全模型(即您需要显式SELECT等,并假设它没有签名等).

此外 - 请务必将表名列入白名单.


Jon*_*eet 5

认为我从未在我见过的任何 SQL 方言中见过这种功能,但这不是一个专业领域。

我建议将字符限制为 AZ、az、0-9、'.'、'_' 和 ' ' - 然后使用适合数据库的任何适当的括号(例如,我相信 SQL Server 的 [])来换行围绕整个事情。然后直接将其放入SQL中即可。

目前尚不完全清楚您所说的不是 SQL 注入风险是什么意思 - 您的意思是名称将出现在源代码中并且仅出现在源代码中吗?如果是这样,我同意这会让事情变得更好。如果您相信您的开发人员不是白痴(有意或无意),您甚至可能不需要自动进行包围。