zoukankan      html  css  js  c++  java
  • ADO.net参数化查询陷阱

           避免SQL漏洞注入攻击,往往采用的是参数化查询!然而在使用参数化查询中,往往为了方便就直接通过构造方法来进行数据的初始化了,然而这样就引发一个这样的问题,当参数值为0时,就出现参数为空的情况了。

    一.参数化查询的几种写法:

    • 使用parameter写法:
      • 写法一:
      • Parameter  p =new Parameter("@id",值);
        cmd.Parameters.Add(p);
      • 写法二(推荐):
      • Parameter p =new Parameter()
        {ParameterName="@id",Value=""};
        cmd.Parameters.Add(p);
    • 使用parameter数组写法:
      • 写法一:
      •  SqlParameter[] pms= {
             new SqlParameter("@id",值),
              .......
              } ;
          cmd.Parameter.AddRange(pms);
      • 写法二(推荐):
      •  SqlParameter[] pms= {
             new SqlParameter("@id", SqlDbType.VarChar),
              .......
              } ;
           parameters[0].Value = "";
          cmd.Parameter.AddRange(pms);

    二.通过构造方法存在的一点问题:

           在参数化查询使用使用构造方法时,在进行构造方法匹配时:零(0)会被匹配成 MySqlDbType类型

    • MySqlParameter的几种构造方法:
         public MySqlParameter();
            public MySqlParameter(string parameterName, MySqlDbType dbType);
            public MySqlParameter(string parameterName, object value);
            public MySqlParameter(string parameterName, MySqlDbType dbType, int size);
            public MySqlParameter(string parameterName, MySqlDbType dbType, int size, string sourceColumn);
            public MySqlParameter(string parameterName, MySqlDbType dbType, int size, ParameterDirection direction, bool isNullable, byte precision, byte scale, string sourceColumn, DataRowVersion sourceVersion, object value);

    问:0为什么没有匹配成object类型方法呢?

    解释:MySqlDbType是一个枚举类型,0就对应了Decimal类型了

    public enum MySqlDbType
        {
            Decimal = 0,
            Byte = 1,
            Int16 = 2,
            Int32 = 3,
            Float = 4,
            Double = 5,
            Timestamp = 7,
            Int64 = 8,
            Int24 = 9,
            Date = 10,
            Time = 11,
            DateTime = 12,
            [Obsolete("The Datetime enum value is obsolete.  Please use DateTime.")]
            Datetime = 12,
            Year = 13,
            Newdate = 14,
            VarString = 15,
            Bit = 16,
    }

    注:所以在进行参数化查询时,尽量选择方法二,进行参数化查询

  • 相关阅读:
    BZOJ-4008: [HNOI2015]亚瑟王 (概率期望DP)
    BZOJ-4832: [Lydsy2017年4月月赛]抵制克苏恩 (概率期望DP)
    BZOJ-1415: [Noi2005]聪聪和可可 (期望DP)
    BZOJ2425 [HAOI2010]计数
    BZOJ2424 [HAOI2010]订货
    BZOJ2423 [HAOI2010]最长公共子序列
    BZOJ2299 [HAOI2011]向量
    BZOJ2298 [HAOI2011]problem a
    BZOJ1040 [ZJOI2008]骑士
    BZOJ一天提交(AC) 51纪念
  • 原文地址:https://www.cnblogs.com/fengxuehuanlin/p/5362697.html
Copyright © 2011-2022 走看看