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,
}

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

原文地址:https://www.cnblogs.com/fengxuehuanlin/p/5362697.html