使用纯字符串时是否可以避免SQL注入攻击
本文关键字:可以避免 SQL 注入 攻击 是否 字符串 | 更新日期: 2023-09-27 18:32:43
我目前正在与用于控制手持阅读器硬件的传统SDK进行交互。它是一个商业SDK和产品,因此除了通过此SDK之外,无法访问硬件。
我正在尝试在手持阅读器的数据库上运行SQL查询,而SDK仅提供了一种方法,具有以下签名:
handReader.QueryDB(string sqlStatement);
因此,这意味着任何查询都可以以字符串的形式传递给该方法。虽然这很简单,但它立即指向可能的SQL注入攻击。
我无法访问该方法的工作原理,因此无法查看其中是否进行了任何详细的SQL预防。因此,我想找到一种方法来参数化字符串,类似于利用 SqlCommand
类的参数化查询。
这可能吗?
我已经实现了一种字符串格式,该格式适用于名称而不是数字这是我的 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;
}