使用参数创建 SQL 数据库

Create SQL Database with parameters

提问人:user2717436 提问时间:7/19/2022 最后编辑:Thom Auser2717436 更新时间:7/20/2022 访问量:348

问:

我在SQL中有一个代码,它使用以下命令创建数据库:

string query = String.Format(
            "CREATE DATABASE [{0}] ON PRIMARY (NAME = N'{0}', FILENAME = N'{1}') LOG ON (NAME = N'{0}_Log', FILENAME = N'{2}') FOR ATTACH",
            dbName, dbFile, logFile)

但是,此代码向 SQL 注入公开。

使用参数重写上述查询不起作用,我知道像 CREATE DATABASE 这样的 DDL 命令不支持参数。

在带有动态参数的代码中编写此 SQL 命令的正确方法是什么?

我宁愿不使用存储过程,因为这是我的代码基础结构的巨大变化。

C# SQL 服务器 SQL 注入

评论

1赞 Jodrell 7/19/2022
sp_executesql呢?
0赞 jarlh 7/19/2022
您使用的是哪些 dbms?(上述语法是特定于产品的。
0赞 user2717436 7/19/2022
@Jodrell,我试过这个,但除了参数之外,它也没有。你有一个工作的例子可以分享吗?谢谢!
0赞 user2717436 7/19/2022
@jarlh,我正在使用 SQL Server
1赞 Alexander Petrov 7/19/2022
动态 SQL 的诅咒与祝福

答:

2赞 Charlieface 7/19/2022 #1

引用需要用于动态 SQL 的名称。QUOTENAME

const string query = @"
DECLARE @sql NVARCHAR(MAX) = N'
CREATE DATABASE ' + QUOTENAME(@dbName) + '
ON PRIMARY (NAME = ' + QUOTENAME(@dbName) + ', FILENAME = ' + @dbFile + ')
LOG ON (NAME = ' + QUOTENAME(@dbName + '_Log') + ', FILENAME = ' + @logFile + ')
FOR ATTACH;
';

EXEC sp_executesql @sql;
";
using (var conn = new SqlConnection("YourConnectionString"))
using (var comm = new SqlCommand(query, conn))
{
    comm.Parameters.Add("@dbName", SqlDbType.NVarChar, 128).Value = dbName;
    comm.Parameters.Add("@dbFile", SqlDbType.NVarChar, 260).Value = dbFile.Replace("'", "''");
    comm.Parameters.Add("@logFile", SqlDbType.NVarChar, 260).Value = logFile.Replace("'", "''");

    conn.Open();
    comm.ExecuteNonQuery();
}

评论

0赞 Jodrell 7/19/2022
两个直接的问题,文件路径绝对不应该传递,我也不确定日志和数据名称。此外,文件路径的参数可能会截断有效值。QUOTENAME
0赞 Jodrell 7/19/2022
因为有效的路径不是以开头的,而且路径不是名称。dbfiddle.uk/....问题中没有任何内容表明 OP 将使用路径的名称。两者都有单独的参数。[
1赞 Charlieface 7/19/2022
你没有使用 dbfiddle.uk/...我承认你关于长度的观点, ''''