4

我目前正在与用于控制手读器硬件的旧版 SDK 进行交互。它是一个商业 SDK 和产品,因此除了通过这个 SDK 之外没有其他方法可以访问硬件。

我正在尝试在掌形仪的数据库上运行 SQL 查询,而 SDK 只提供了一种方法来执行此操作,具有以下签名:

handReader.QueryDB(string sqlStatement);

因此,这意味着任何查询都可以以字符串的形式传递给该方法。虽然这很简单,但它立即指向可能的 SQL 注入攻击。

我无权访问该方法的工作原理,因此无法查看其中是否有任何详细的 SQL 预防措施。因此,我想找到一种方法来参数化字符串,类似于使用SqlCommand类的参数化查询。

这可能吗?

4

1 回答 1

0

我已经实现了一种使用名称而不是数字的字符串格式这是我的 sql 字符串:

string sqlStr = @"select * from Table1 t1
where t1.field1 = @Field1 and IsActive = 1";

int F1 = 12; 
sqlStr = sqlStr.NamedStringFormatSQL(new
        {
            Field1 = F1
        });

这是格式化程序的代码:

public static Dictionary<string, object> AnonymousToDictionary(object value)
    {
        Dictionary<string, object> dic = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
        if (value != null)
        {
            foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(value))
            {
                object obj2 = descriptor.GetValue(value);
                dic.Add(descriptor.Name, obj2);
            }
        }
        return dic;
    }


   public static string NamedStringFormatSQL(this string aString, object replacements)
        {
            Dictionary<string, object> keyValues = AnonymousToDictionary(replacements);
            foreach (var item in keyValues)
            {
                string val = item.Value == null ? "null" : item.Value.ToString();
                aString = aString.Replace("@" + item.Key, val);
            }
            return aString;

        }
于 2013-09-28T05:01:19.513 回答