您的位置:首页 > 数据库

sql 防注入漏洞

2015-09-19 15:42 337 查看
一、为了防止sql 注入漏洞,应使用sql参数
以下代码 当 textBox1.Text 是 1' or '1'='1 时就会产生 sql 注入漏洞
private void button1_Click(object sender, EventArgs e)
        {
            using(SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=ZTest;User Id=sa;Password=1"))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                 // 输入  1' or '1'='1       会造成sql 注入漏洞
                   cmd.CommandText = "select age from Student where name='" + textBox1.Text + "'";
                    using (SqlDataReader read = cmd.ExecuteReader())
                    {
                        while (read.Read())
                        {
                            // GetInt32 获得的是int 类型
                            // GetInt64 获得的是long 类型
                            int age = read.GetInt32(0);
                        }
                    }
                }
            }
        }


修改代码:使用sql参数可以防止漏洞

private void button1_Click(object sender, EventArgs e)
        {
            using(SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=ZTest;User Id=sa;Password=1"))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
cmd.CommandText = "select age from Student where name=@name1";
                    //cmd.Parameters.Add("@name1", textBox1.Text);
                    //cmd.Parameters.AddWithValue("@name1", textBox1.Text);
                    cmd.Parameters.Add(new SqlParameter("@name1", textBox1.Text));
                    using (SqlDataReader read = cmd.ExecuteReader())
                    {
                        while (read.Read())
                        {
                            // GetInt32 获得的是int 类型
                            // GetInt64 获得的是long 类型
                            int age = read.GetInt32(0);
                        }
                    }
                }
            }
        }


注释:凡是以字符串拼接的sql语句都存在漏洞,包括StringBuilder 等,要防止漏洞必须使用sql参数
凡是继承 IDisposable 接口的类 ,做好使用 using ,这样可以确保最后释放资源,
如果使用try catch finally 难免最后忘记关闭链接,手动释放资源问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: