使用存储过程能够防止SQL注入,但是,插入,修改,删除,都好说,而查询语句还真不知怎么写,我现在的办法是查询语句用的是字符串拼接方式,这样就给系统留下引反,我想把查询语句也用存储过程,可就是不知道怎样写存储过程,每一个表查询的参数都是用户随意给的,每次查询的条件都不一样啊,而且每一个表的字段又那么多,到底该怎么做.
查询SQL到底怎么写?
除了用存储过程外大家还有什么好的防止SQL注入的办法没有?

解决方案 »

  1.   

    只要不动态拼接SQL,一般不会有注入漏洞。
      

  2.   

    #region 验证参数
            /// <summary>
            /// 验证参数
            /// </summary>
            /// <param name="parameter"></param>
            /// <returns></returns>
    public string Parameter(string parameter)
    {
    ArrayList ary=new ArrayList();
    ary.Add("select");
    ary.Add("insert");
    ary.Add("update");
    ary.Add("delete");
    ary.Add("exec");
    ary.Add("create");
                //sql关键字等等.........
    if(parameter!=null)
    {
    for(int i=0;i<ary.Count;i++)
    {
    if(parameter.IndexOf(ary[i] as string)!=-1)
    {
    return null;
    }
    }
    }
    return parameter;
    }
    #endregion
      

  3.   

    单个表查询,允许使用这个表的任意字段为条件即可,就无需拼接SQL了
      

  4.   

    坚持使用SqlDataParameters或OleDbParameters
      

  5.   

    将所有的查询条件使用SqlDataParameters传入 关键的查询条件采用 = 连接  其他查询条件 采用 like 连接,这样可以满足一部分组合条件查询 
      

  6.   

    限制当前sql帐户的权限啊,只给他读写数据的权限,没有创建表的权限.
    如果他能猜出你表的结构,给你表里面加数据,你就得想想了.
      

  7.   


    SET @sql=
       'UPDATE gcfyb SET fyval=round('+@new_jsgs1+',2) FROM gcfyb WHERE fydh='''+@fydh+''' and xhid IS NOT NULL AND new_jsgs IS NOT NULL and projectid=''4ce050d4-44e3-47cd-8903-fb7b420cb628'''
    EXEC(@sql)
      

  8.   

    不要使用拼接SQL,要参数化,参数化变量
      

  9.   

    SQL的条件每次都不一样,我的意思是拼接那种带参数的SQL语句,然后参数化,可具体怎么写
    表示层用什么方法把参数传递给数据层?
      

  10.   

    不用拼SQL的方式,用参数化的方式。
      

  11.   

    一. 使用存储过程
    二. 第三方DLL 如:filter.dll 只需在Web.config里配置下,很方便的
      

  12.   

    key words "'" and space~ 
    set @DirControlTitle = replace(@DirControlTitle,'''','''''')