gpt4 book ai didi

c# - Odbc 命令。表名参数化

转载 作者:太空宇宙 更新时间:2023-11-03 13:49:26 27 4
gpt4 key购买 nike

我在对 C# 中的 odbc 驱动程序的 OdbcConnection 执行参数化 sql 查询时遇到问题。列名和表名可以从 web gui 配置,所以我希望它免受注入(inject)

using (OdbcCommand command = connection.CreateCommand())
{
command.CommandText = "SELECT ? FROM ?";
command.CommandTimeout = SynchTimeout;
command.CommandType = CommandType.Text;

command.Parameters.Add(new OdbcParameter(string.Empty, "User"));
command.Parameters.Add(new OdbcParameter(string.Empty, "TableName"));

OdbcDataReader reader = command.ExecuteReader();
while (reader.Read())
{
// TODO: Do something clever..
}
}

对列名“用户”使用 odcparameters 似乎没问题。但是如果我将表名添加为带有占位符“?”的参数我收到以下错误:错误 [HY000] [Microsoft][ODBC Excel Driver] 参数“Pa_RaM002”指定了需要表名的位置。

如果表名不能是 OdbcParameter,有谁知道如何在这种情况下安全地传递表名?

最佳答案

我认为在 SQL 中参数化表名和列名是不可能的。因此,在某种程度上,您仍然会求助于字符串连接来构建动态 SQL 语句。

虽然您可以在执行语句之前进行一些检查。我看到您可以执行两种类型的检查:

<强>1。白名单检查(更好的解决方案)

如果可能,请列出您允许以这种方式使用的表和列。当用户指定表和列时,请确保您只允许列表中的元素。

<强>2。动态检查(有风险的解决方案)

仅当表/列的名称事先未知(例如:动态创建)并且不可能建立白名单时才应用此方法。否则,请采用白名单方法。

您可以检查数据库中是否存在配置的表和列。

例如,如果您使用的是 SQL Server,则可以通过查询 the Information Schema views 来完成此操作,像这样:

select top 1 COLUMN_NAME
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = @tableNameParameter
and COLUMN_NAME = @columnNameParameter
and <additional criteria*>

为避免过于频繁地运行检查,您可以在允许配置表名和列名的网页中执行这些检查作为验证。

*警告:如果您只验证表和列是否存在,这将使用户能够发现数据库中的所有表。为避免这种情况,您可以在 SQL 中添加一个额外的条件,以确保您只选择旨在以这种方式使用的表。例如,所有动态表都可以有一个特定的前缀,所以你可以做 [...] 和 TABLE_NAME like 'prefix%'


无论您选择哪种解决方案,请注意,从安全角度来看,它是至关重要的。您应该非常小心允许系统的哪些组件写入自定义表/列值并在每个点中应用验证。

关于c# - Odbc 命令。表名参数化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14124261/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com