zoukankan      html  css  js  c++  java
  • 9.4.1 使用参数来防止SQL注入

      SQL注入的威力是不可忽视的,下面我们主要介绍防范方法——使用参数化SQL。对于不同的数据供应器都有对就的 Parameter 来表示SQL语句或者存储过程中的各种参数。参数和数据库字段的真实类型——对应,所有参数的值会仅仅被认为一个参数。因此,在参数中任何SQL语句都是没有意义的。
    string sConnectionString = @"Server=(local)\SQLEXPRESS;database=Forum;Trusted_Connection=True";
    using (SqlConnection conn = new SqlConnection(sConnectionString))
    {
        conn.Open();
        
    using (SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM tbClass WHERE ClassName=@ClassName", conn))
        {
            cmd.Parameters.AddWithValue(
    "@ClassName", tb_ClassName.Text);
            Response.Write(
    string.Format("共有{0}条记录符合要求<br />", cmd.ExecuteScalar().ToString()));
        }
    }

    在这段程序中,我们使用参数代替字符串的拼接。我们需要注意如下几点。

    ·SQL语句或者存储过程中指定的所有参数必须和Parameters属性中的所有参数对应。

    ·参数集合的Add()方法有多种重载

    cmd.Parameters.AddWithValue("@ClassName", tb_ClassName.Text);

    //就可以替代

    cmd.Parameters.Add(
    "@ClassName", SqlDbType.VarChar, 50);
    cmd.Parameters[
    "@ClassName"].Value = tb_ClassName.Text;

      AddWithValue()方法会自动检测参数的类型和长度,对于Add()方法其实也可以省略参数类型和长度。不过为了程序的可读性还是建议你为参数指字类型和长度,当然这个类型和长度需要和数据库字段的真实类型和长度对应。

      我们还注意到,SqlParameter 对象有一个 Diection 方法。对于SQL语句中的参数,这个值没有什么意义,它是用来指定存储过程参数方向。它的值由 ParameterDirection 枚举来定义,共有以下4个类型。

          ·Input

      ·InputOutput

      ·Putput

      ·ReturnValue

  • 相关阅读:
    洛谷 P3366 【模板】最小生成树
    洛谷 P2820 局域网
    一本通【例4-10】最优布线问题
    洛谷 P1546 最短网络 Agri-Net
    图论模板
    洛谷 AT667 【天下一人力比較】
    刷题记录
    洛谷P1553 数字翻转(升级版)
    tornado硬件管理系统-网络与磁盘的实现(7)
    tornado硬件管理系统-内存与swap的实现(6)
  • 原文地址:https://www.cnblogs.com/0754ydj/p/1256783.html
Copyright © 2011-2022 走看看