C#解析SQL语句以使用参数

时间:2014-05-26 13:30:44

标签: c# sql

困境:我需要在另一个应用程序中构建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#中动态提取的?如果是这样,我将如何提取参数的数据类型?这可能吗?

3 个答案:

答案 0 :(得分:2)

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

对于运行即席查询,我强烈建议依赖权限,而不是SQL解析。用户应该能够自己注入所有内容,但权限应该可以防止任何损害。您将无法阻止(有意或无意)DOS运行导致服务器瘫痪的错误查询,但为此会有resource governanceaudit

但我不能强调这一点:你不会解决问题。 Multi-byte character exploits现在已经有10年了,而且我很确定我不知道大部分过滤/解析旁路技术。

答案 1 :(得分:1)

如果您的任务只是在数据库周围编写一个包装器,以便其他开发人员可以发送自己的SQL并获得结果,那么SQL注入就是#34;正常用例"。无法知道请求是否是恶意的。如果你被允许运行" good"代码,你总能运行"邪恶"代码。

答案 2 :(得分:0)

您可以从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");
}