码迷,mamicode.com
首页 > 数据库 > 详细

SqlHelper中IN集合场景下的参数处理

时间:2016-12-12 23:52:07      阅读:302      评论:0      收藏:0      [点我收藏+]

标签:ade   数据   images   blog   connect   系统   sql注入   play   block   

我手头有个古老的项目,持久层用的是古老的ADO.net。前两天去昆明旅游,其中的一个景点是云南民族村,通过导游介绍知道了一个古老的民族——基诺族,这是我国的第56个民族。  项目里的ado.net和基诺族一样古老。

技术分享

话说,项目里数据访问层,好多都是拼的sql,这给sql注入提供了可乘之机,为了系统安全,决定在有限的时间内,将它改成参数化。

其中,有个根据多个订单号查询支付单的方法,签名如下:

public DataTable GetAlipayNotifyRecords(AlipayPaymentStatus status, params string[] trade_no)

那么,问题来了,因为sql里有in, 而 in(@no)的方式是行不通的。

怎么办呢?  首先想到的是对参数做处理:

public DataTable GetAlipayNotifyRecords(AlipayPaymentStatus status, params string[] trade_no)
{
    string sql = @"select * from T_AlipayNotityRecord where trade_status=@trade_status and trade_no in(@trade_no)";
    //string inValue = "‘" + string.Join("‘,‘", trade_no) + "‘";//= string.Join(",", trade_no)
    string inValue = "";
    trade_no.ToList().ForEach(no => inValue += " union all select ‘" + no+"");
    inValue = inValue.Substring(" union all".Length);
    List<SqlParameter> paramList = new List<SqlParameter>()
        {
             new SqlParameter("@trade_status",status.ToString()), 
             new SqlParameter("@trade_no",inValue),
        };
    var ds = SqlHelper.SqlDataSet(ConfigFile.PayCenterConnection, sql, CommandType.Text, paramList.ToArray());
    if (ds == null || ds.Tables.Count == 0)
        return null;
    return ds.Tables[0];
}

经测试,无效。经分析可知,sqlhelper会把你参数值当成字符串,不会对其做转义。所以,不管怎么处理,都还是一串字符串。

后来呢,想到了一个方法,借union之力实现了:

public DataTable GetAlipayNotifyRecords(AlipayPaymentStatus status, params string[] trade_no)
{
    string sql = @"select * from T_AlipayNotityRecord where trade_status=@trade_status and ({0})";

    List<SqlParameter> paramList = new List<SqlParameter>()
        {
             new SqlParameter("@trade_status",status.ToString()), 
        };
    string sql1 = "";
    for (int i=0;i<trade_no.Length;i++)
    {
        sql1 += " or trade_no=@no" + i;
        paramList.Add(new SqlParameter("@no" + i, trade_no[i]));
    }
    sql = string.Format(sql, sql1.Substring(" or ".Length));

    var ds = SqlHelper.SqlDataSet(ConfigFile.PayCenterConnection, sql, CommandType.Text, paramList.ToArray());
    if (ds == null || ds.Tables.Count == 0)
        return null;
    return ds.Tables[0];
}

【结语】无意中从园子里看到一篇文章,不该活着的SqlHelper和DBHelper,很赞!

 

SqlHelper中IN集合场景下的参数处理

标签:ade   数据   images   blog   connect   系统   sql注入   play   block   

原文地址:http://www.cnblogs.com/buguge/p/6165972.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!