我正在使用一个LINQ提供程序,它使用IQ Toolkit将LINQ查询转换为SQL查询。 IQ Toolkit提供的类是否可以免受SQL注入攻击?如果没有,我必须做些什么来防止SQL注入攻击,假设我正在使用IQ Toolkit并实现我自己的LINQ提供程序。我看了LINQ to SQL uses SqlParameter, 但是我仍然不清楚需要使用SqlParameter来防止SQL注入。
答案 0 :(得分:2)
从博客post看来,IQ工具包(或工具包的初始版本)对SQL注入攻击并不安全。但您可以自己验证它 - 执行查询,捕获生成的SQL并查看是否使用了参数。
答案 1 :(得分:1)
如果您想建立自己的提供商,您必须知道它并不那么容易。考虑嵌套选择,嵌套在哪里等等。在这个主题上有很棒的blog posts。
但您有兴趣保护您的数据库免受SQL注入。因此,如果您查看此page和VisitConstant
方法的示例代码,那么您将遇到值类型(字符串,整数等)或IQueryable的常量。
防止SQL注入并不复杂,您只需创建新的SQLParameter
,或者调用here所述的方法DbProviderFactory.CreateParameter
。在遍历表达式树时,您将需要一些集合来存储参数。所以修改后的代码如下所示:
protected override Expression VisitConstant(ConstantExpression c) {
IQueryable q = c.Value as IQueryable;
if (q != null) {
// assume constant nodes w/ IQueryables are table references
sb.Append("SELECT * FROM ");
sb.Append(q.ElementType.Name);
}
else if (c.Value == null) {
sb.Append("NULL");
}
else {
switch (Type.GetTypeCode(c.Value.GetType())) {
case TypeCode.Boolean:
param = dbProvider.CreateParameter();
param.Name = "@param" + paramsList.Count;
param.Value = (((bool)c.Value) ? 1 : 0;
paramsList.Add(param);
sb.Append(param.Name);
break;
case TypeCode.String:
param = dbProvider.CreateParameter();
param.Name = "@param" + paramsList.Count;
param.Value = c.Value; // you don't have to care about escaping or formatting
paramsList.Add(param);
sb.Append(param.Name);
break;
...
case TypeCode.Object:
throw new NotSupportedException(string.Format("The constant for '{0}' is not supported", c.Value));
default:
sb.Append(c.Value);
break;
}
}
return c;
}
因此,在浏览表达式树时,您正在构建SQL字符串并收集SQL参数。