首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL提供程序和IQueryable注入?

问SQL提供程序和IQueryable注入?
EN

Stack Overflow用户
提问于 2011-09-19 22:21:26
回答 2查看 756关注 0票数 2

我正在开发一个LINQ提供程序,它使用IQ Toolkit将LINQ查询转换为SQL查询。IQ工具包提供的类是否安全,不会受到SQL注入攻击?如果不是,假设我正在使用IQ工具包并实现我自己的LINQ提供程序,那么我必须做些什么来防止SQL注入攻击。我阅读了LINQ to SQL uses SqlParameter,但我仍然不清楚需要对SqlParameter做些什么来防止SQL注入。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-19 22:55:42

如果你想构建你自己的提供者,你必须知道这并不容易。考虑像嵌套的select,嵌套的where等,在这个主题上有很好的blog posts。

但是您感兴趣的是保护数据库不受SQL注入的影响。因此,如果您查看此page和VisitConstant方法上的示例代码,就会遇到值类型的常量(字符串、整数等)。或者IQueryable。

防止SQL注入并不复杂,您只需创建新的SQLParameter或调用DbProviderFactory.CreateParameter描述的here方法即可。在遍历表达式树时,您需要一些集合来存储参数。因此,修改后的代码将如下所示:

代码语言:javascript
复制
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参数。

票数 1
EN

Stack Overflow用户

发布于 2011-09-19 22:27:39

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7472419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档