gpt4 book ai didi

c# - 如何保护此函数免受 SQL 注入(inject)?

转载 作者:可可西里 更新时间:2023-11-01 08:52:04 25 4
gpt4 key购买 nike

public static bool TruncateTable(string dbAlias, string tableName)
{
string sqlStatement = string.Format("TRUNCATE TABLE {0}", tableName);
return ExecuteNonQuery(dbAlias, sqlStatement) > 0;
}

最佳答案

对抗 SQL 注入(inject)的最常见建议是使用 SQL 查询参数(此线程中的几个人都建议过)。

在这种情况下这是错误的答案。不能在 DDL 语句中使用 SQL 查询参数作为表名。

SQL 查询参数只能用于代替 SQL 表达式中的文字值。这是每个 SQL 实现的标准。

当您有表名时,我的建议是针对已知表名列表验证输入字符串以防止 SQL 注入(inject)。

您可以从 INFORMATION_SCHEMA 中获取有效表名的列​​表:

SELECT table_name 
FROM INFORMATION_SCHEMA.Tables
WHERE table_type = 'BASE TABLE'
AND table_name = @tableName

现在您可以将输入变量作为 SQL 参数传递给此查询。如果查询未返回任何行,则您知道输入不能用作表。如果查询返回一行,则它匹配,因此您可以更有把握地安全使用它。

您还可以根据您定义的特定表列表验证表名,这些表可以让您的应用截断,如@John Buchanan suggests .

即使在验证 tableName 作为 RDBMS 中的表名存在之后,我也建议对表名进行定界,以防万一您使用带有空格或特殊字符的表名。在 Microsoft SQL Server 中,默认的标识符分隔符是方括号:

string sqlStatement = string.Format("TRUNCATE TABLE [{0}]", tableName);

现在,如果 tableName 与真实表匹配,并且您实际上在表名中使用了方括号,那么您将面临 SQL 注入(inject)风险!

关于c# - 如何保护此函数免受 SQL 注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1862036/

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