我正在开发一个LINQ提供程序,它使用IQ Toolkit将LINQ查询转换为SQL查询。IQ工具包提供的类是否安全,不会受到SQL注入攻击?如果不是,假设我正在使用IQ工具包并实现我自己的LINQ提供程序,那么我必须做些什么来防止SQL注入攻击。我阅读了LINQ to SQL uses SqlParameter,但我仍然不清楚需要对SqlParameter做些什么来防止SQL注入。
发布于 2011-09-19 22:55:42
如果你想构建你自己的提供者,你必须知道这并不容易。考虑像嵌套的select,嵌套的where等,在这个主题上有很好的blog posts。
但是您感兴趣的是保护数据库不受SQL注入的影响。因此,如果您查看此page和VisitConstant方法上的示例代码,就会遇到值类型的常量(字符串、整数等)。或者IQueryable。
防止SQL注入并不复杂,您只需创建新的SQLParameter或调用DbProviderFactory.CreateParameter描述的here方法即可。在遍历表达式树时,您需要一些集合来存储参数。因此,修改后的代码将如下所示:
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参数。
发布于 2011-09-19 22:27:39
从博客post上看,IQ工具包(或工具包的初始版本)不安全,不会受到SQL注入攻击。但您可以自己验证它-执行查询,捕获生成的SQL,并查看是否使用了参数。
https://stackoverflow.com/questions/7472419
复制相似问题