c#解析SQL语句使用参数

本文关键字:参数 语句 解析 SQL | 更新日期: 2023-09-27 18:05:05

困境:我需要在另一个应用程序中构建一个API。在这个API中,我们必须允许开发人员在SQL服务器上运行SQL语句…不幸的是,我们是非常有限的(是的,世界是颠倒过来的),我们可以做些什么来减少SQL注入…我们不能在SQL服务器上创建sp,我们也不能限制用户可以为他/她的查询输入什么。现在,当我被告知,因为我们正在为"其他开发人员"构建一个API,我们不应该担心SQL注入,我不倾向于同意,我真的想阻止,如果我可以…

所以我在想我能做什么,这就是我的问题所在,是将查询解析为:

  • 检查SQL注入模式,如果发现返回错误;或
  • 删除任何"赋值"部分,并动态替换为参数

在我的情况下,这是我仅有的两个选择吗?如果是这样,您将如何实现上面的第2条,使这个示例语句:

SELECT * FROM Table WHERE Field1='test' AND Field2=1

就变成:

SELECT * FROM Table WHERE Field1=@Field1 AND Field2=@Field2

在c#中动态提取参数的地方?如果是这样,我该如何提取参数的数据类型呢?这可能吗?

c#解析SQL语句使用参数

您无法在应用程序端解决这个问题。您可以尽可能多地限制,并解析您想要的所有内容,但是SQL注入攻击正在不断发展,并且正在创建新的向量,将绕过您的解析。

对于运行临时查询,我强烈建议依赖于权限,而不是SQL解析。用户应该能够注入自己想要的任何东西,但权限应该防止任何损害。您将无法防止(有意或无意)DOS运行导致服务器崩溃的错误查询,但为此有资源治理和审计。

但是我怎么强调都不为过:你无法把自己从问题中解析出来。多字节字符攻击现在已经有10年的历史了,我很确定我不知道大多数的过滤/解析旁路技术。

如果你的任务只是在数据库周围编写一个包装器,以便其他开发人员可以发送他们自己的SQL并获得结果,那么SQL注入是"正常用例"。没有办法知道一个请求是否是恶意的。如果你被允许运行"好的"代码,你将永远能够运行"坏的"代码。

可以从SQL语法中提取参数

SqlConnection sqlCon = new SqlConnection("...");
String sqlScript = "Somethings ...";
Regex r = new Regex(@"(?<Parameter>@'w*)", RegexOptions.Compiled);
string[] parameters = r.Matches(sqlScript).Cast<Match>().Select<Match, string>(x => x.Value.ToLower()).Distinct<string>().ToArray<string>();
SqlCommand sqlCom = new SqlCommand(sqlScript, sqlCon);
foreach (string sqlParam in parameters)
{
    sqlCom.Parameters.AddWithValue(sqlParam, "PARAMETER VALUE");
}