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

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

  • 相关阅读:
    mysql小数和类型转换函数
    concat()用法
    sql修改表名字段名
    having函数,case when与order by
    volatile实现原理与应用
    synchronized的实现原理与应用
    java8策略模式
    centos7快速升级gcc
    一个用户从发起请求到接收到响应,中间经过哪些服务,每个服务做什么事情
    Java注解
  • 原文地址:https://www.cnblogs.com/fengxuehuanlin/p/5362697.html
Copyright © 2011-2022 走看看