gpt4 book ai didi

c# - 如何生成不容易受到 SQL 注入(inject)攻击的字符串

转载 作者:太空狗 更新时间:2023-10-30 01:29:20 25 4
gpt4 key购买 nike

我有一个生成查询字符串的实用程序,但静态代码分析器(和我的同事)提示“SQL 注入(inject)攻击”的风险。

这是我的C#代码

    public static string[] GenerateQueries(string TableName, string ColumnName)
{
return new string[] {
"SELECT * FROM " + TableName,
"SELECT * FROM " + TableName + " WHERE 1=2",
"SELECT * FROM " + TableName + " WHERE [" + TableName + "Id] = @id",
"SELECT * FROM " + TableName + " WHERE [" + TableName + "Id] = IDENT_CURRENT('" + TableName + "')",
"SELECT * FROM " + TableName + " WHERE [" + ColumnName + "] = @value"
};
}

在代码中我总是用常量字符串调用它,例如

var queryList = GenerateQueries("Person", "Name");

有什么方法可以重写这个函数使其“安全”吗?例如,如果我使用 C 而不是 C#,我可以编写一个 来安全地生成字符串。

目前,我唯一的选择是为每个表复制/粘贴这个 SELECT 语句 block ,这很丑陋并且是维护负担。

复制/粘贴真的是我唯一的选择吗?

编辑:

感谢您的回复,尤其是 William Leader。现在我发现我的问题是错误的。这不仅仅是因为我连接了查询字符串,而且还将它们存储在变量 中。唯一正确的方法是使用常量构造 SqlDataAdapter,例如,

var adapter = new SqlDataAdapter("SELECT * FROM PERSON");

别无选择。所以是的,会有很多复制/粘贴。我开始后悔没有使用 EF。

最佳答案

一开始我很震惊,但仔细想想,这与代码中已有 SQL 语句没有什么不同,如下所示:

"SELECT * FROM Person"

我们一直在做这种事情。

如果

这里有一个重要的警告。只有您可以控制函数的调用方式时,这才是正确的。因此,如果此方法是某处数据层类的私有(private)成员,您可能没问题。但我也想知道这到底有多大用处。与仅编写查询所获得的 yield 相比,您似乎并没有节省太多。

此外,养成忽视静态分析工具的习惯也不好。有时他们会给你一些你知道是错误的东西,但你还是要改变它,这样当他们确实发现一些重要的东西时你就不会忽视它。

关于c# - 如何生成不容易受到 SQL 注入(inject)攻击的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52487740/

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