IQueryable LINQ提供程序和SQL注入?

时间:2011-09-19 14:21:26

标签: linq sql-injection iqueryable

我正在使用一个LINQ提供程序,它使用IQ Toolkit将LINQ查询转换为SQL查询。 IQ Toolkit提供的类是否可以免受SQL注入攻击?如果没有,我必须做些什么来防止SQL注入攻击,假设我正在使用IQ Toolkit并实现我自己的LINQ提供程序。我看了LINQ to SQL uses SqlParameter,  但是我仍然不清楚需要使用SqlParameter来防止SQL注入。

2 个答案:

答案 0 :(得分:2)

从博客post看来,IQ工具包(或工具包的初始版本)对SQL注入攻击并不安全。但您可以自己验证它 - 执行查询,捕获生成的SQL并查看是否使用了参数。

答案 1 :(得分:1)

如果您想建立自己的提供商,您必须知道它并不那么容易。考虑嵌套选择,嵌套在哪里等等。在这个主题上有很棒的blog posts

但您有兴趣保护您的数据库免受SQL注入。因此,如果您查看此pageVisitConstant方法的示例代码,那么您将遇到值类型(字符串,整数等)或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参数。